- 移植安装
2) 帮助
>.help
3) 可在命令行下直接输入sql语句创建表,用“;”结束,回车就可看到结果
4) 查看所有表
>.tables
5) 查看结构
>.schema 表名
6) 查看目前挂的数据库
>.database
7) 把查询输出到文件
>.output filename
>查询语句;
把查询结果用屏幕输出
>.output stdout
8) 把表结构输出,同时索引也会输出
>.dump 表名
9) 退出
>.exit 或者 .quit
原文链接:https://www.f2er.com/sqlite/200914.html
1. 下载源码包
# cd sqlite-autoconf-3070500
# ./configure --host=arm-linux --prefix=/root/build_sqlite
(如果想生成x86可执行的版本,省去"--host=..."即可,其他步骤不变)
-------------------------------------------------------------
- 使能内存管理功能(即 int sqlite3_release_memory(int); 方法)
打开Makefile文件,在 DEFS = ... 后面添加编译选项:-DsqlITE_ENABLE_MEMORY_MANAGEMENT
sqlite总是倾向于将数据缓存在内存中,以此减少IO操作的次数,对于传入sqlite API的指针变量,使用完后必须手动释放内存。
# ./configure --host=arm-linux --prefix=/root/build_sqlite
(如果想生成x86可执行的版本,省去"--host=..."即可,其他步骤不变)
-------------------------------------------------------------
- 使能内存管理功能(即 int sqlite3_release_memory(int); 方法)
打开Makefile文件,在 DEFS = ... 后面添加编译选项:-DsqlITE_ENABLE_MEMORY_MANAGEMENT
sqlite总是倾向于将数据缓存在内存中,以此减少IO操作的次数,对于传入sqlite API的指针变量,使用完后必须手动释放内存。
释放内存:
sqlite3_free(msg);
sqlite3_free_table(dataSet);
4. make & make install
成功后将在 /root/build_sqlite 目录下生成4个目录(bin、include、lib、share)
5. 下载
sqlite3_free_table(dataSet);
-------------------------------------------------------------
4. make & make install
成功后将在 /root/build_sqlite 目录下生成4个目录(bin、include、lib、share)
5. 下载
将 bin 下的文件下载到开发板的 /usr/bin 目录中
将 lib 下的所有文件下载到开发板的 /usr/lib 目录中
include目录下是sqlite的C语言API的头文件,编程时会用到
6. 测试
[rootMrFeng]#sqlite3 test.db (sqlite数据库一般以“db”作为扩展名,但不强制要求)
sqlite version 3.6.18
Enter ".help" for instructions
Enter sql statements terminated with a ";"
sqlite> create table film (number,name);
sqlite> insert into film values (1,'aaa');
sqlite> insert into film values (2,'bbb');
sqlite> select * from film;
1|aaa
2|bbb
sqlite>.quit
[rootMrFeng]#
7.test_sqlite.c
将 lib 下的所有文件下载到开发板的 /usr/lib 目录中
include目录下是sqlite的C语言API的头文件,编程时会用到
6. 测试
[rootMrFeng]#sqlite3 test.db (sqlite数据库一般以“db”作为扩展名,但不强制要求)
sqlite version 3.6.18
Enter ".help" for instructions
Enter sql statements terminated with a ";"
sqlite> create table film (number,name);
sqlite> insert into film values (1,'aaa');
sqlite> insert into film values (2,'bbb');
sqlite> select * from film;
1|aaa
2|bbb
sqlite>.quit
[rootMrFeng]#
7.test_sqlite.c
执行结果如下:
[root@localhost ~]# ./test_sqlite test.db "select * from film"
number = 1
name = aaa
number = 2
name = bbb
[root@localhost ~]# ./test_sqlite test.db "select * from film"
number = 1
name = aaa
number = 2
name = bbb
- 基本操作
2) 帮助
>.help
3) 可在命令行下直接输入sql语句创建表,用“;”结束,回车就可看到结果
4) 查看所有表
>.tables
5) 查看结构
>.schema 表名
6) 查看目前挂的数据库
>.database
7) 把查询输出到文件
>.output filename
>查询语句;
把查询结果用屏幕输出
>.output stdout
8) 把表结构输出,同时索引也会输出
>.dump 表名
9) 退出
>.exit 或者 .quit
10) 查看配置信息
>.show
- vacuum
当从sqlite删除数据后,未使用的磁盘空间被添加到一个内在的“空闲列表”
(“空闲列表”用于存储下次插入的数据)因此不向操作系统返回磁盘空间
以下2种方法可回收这部分磁盘空间:
1. 在创建数据库时将 auto-vacuum 设为1(默认为0)
缺点:会产生碎片
注意:auto-vacuum 的值只有在未建任何表的情况下才允许改变
auto-vacuum 选项在 sqlite 3.1 后才出现
2. 执行“vacuum”命令
缺点:比方法1耗时
注意:官方说法是“在Linux的环境下,大约0.5秒/M”
说明:
命令行操作:
sqlite3 *.db vacumm // 不打开数据库
vacuum; // 打开数据库
程序操作:sql = "vacuum" // 然后执行该语句
当从sqlite删除数据后,未使用的磁盘空间被添加到一个内在的“空闲列表”
(“空闲列表”用于存储下次插入的数据)因此不向操作系统返回磁盘空间
以下2种方法可回收这部分磁盘空间:
1. 在创建数据库时将 auto-vacuum 设为1(默认为0)
缺点:会产生碎片
注意:auto-vacuum 的值只有在未建任何表的情况下才允许改变
auto-vacuum 选项在 sqlite 3.1 后才出现
2. 执行“vacuum”命令
缺点:比方法1耗时
注意:官方说法是“在Linux的环境下,大约0.5秒/M”
说明:
命令行操作:
sqlite3 *.db vacumm // 不打开数据库
vacuum; // 打开数据库
程序操作:sql = "vacuum" // 然后执行该语句
- 开发基础
1. sqlite不支持DataTime数据类型,可用TimeStamp类型替代。
2. 在sqlite命令行下执行 .header [on|off] 可显示或隐藏表头。
3. sqlite下的int类型支持 > 32bit 数值。
2. 在sqlite命令行下执行 .header [on|off] 可显示或隐藏表头。
3. sqlite下的int类型支持 > 32bit 数值。
4. 自增字段:将主键设置为整型,插入数据时使用null替代。
5. 时间函数:datetime()、date()、time()。
获取数据库中所有表/索引的信息
>select * from sqlite_master;
* 当文件(与扩展名无关)为空白时同样能执行上述语句,且返回相同结构的表,但记录数为0
* 可以用来判断某个文件是否是sqlite数据库文件
>select * from sqlite_master;
* 当文件(与扩展名无关)为空白时同样能执行上述语句,且返回相同结构的表,但记录数为0
* 可以用来判断某个文件是否是sqlite数据库文件
- 数据库打开操作
sqlite API 中有多个方法可打开数据库,包括:
sqlITE_API int sqlite3_open(
const char *filename,/* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: sqlite db handle */
);
sqlITE_API int sqlite3_open16(
const void *filename,/* Database filename (UTF-16) */
sqlite3 **ppDb /* OUT: sqlite db handle */
);
sqlITE_API int sqlite3_open_v2(
const char *filename,/* Database filename (UTF-8) */
sqlite3 **ppDb,/* OUT: sqlite db handle */
int flags,/* Flags */
const char *zVfs /* Name of VFS module to use */
);
------------------------------------------------------------------------
其中,sqlite3_open()、sqlite3_open16()方法当数据库文件不存在时依然返回true
因此,若需要判断数据库文件是否存在时应该选用sqlite3_open_v2()方法
sqlite3_open_v2()中常用的flags包括:
sqlITE_OPEN_READONLY // 只读,文件不存在时返回false
sqlITE_OPEN_READWRITE // 读写,文件不存在时返回false
sqlITE_OPEN_CREATE // 文件不存在时则创建
以下几种情况会导致sqlite3_open_v2()返回false:
1. 指定的文件不存在
2. 指定的文件为非sqlite数据库文件
3. 指定的文件被加密
* 注意:由于空白文件能成功打开,如需要判断数据库是否为空,则可参考下述方法:
char **dataSet;
int nrow;
int ncolumn;
char *msg;
int ret;
std::string stdString = sql.toStdString();
const char *s = stdString.c_str();
// 若文件存在,则判断数据库中是否存在表/索引等
ret = sqlite3_get_table(db,s,&dataSet,&nrow,&ncolumn,&msg);
if (ret != sqlITE_OK)
{
qDebug() << "Msqlite3::open(): Database check error.";
return false;
}
sqlite API 中有多个方法可打开数据库,包括:
sqlITE_API int sqlite3_open(
const char *filename,/* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: sqlite db handle */
);
sqlITE_API int sqlite3_open16(
const void *filename,/* Database filename (UTF-16) */
sqlite3 **ppDb /* OUT: sqlite db handle */
);
sqlITE_API int sqlite3_open_v2(
const char *filename,/* Database filename (UTF-8) */
sqlite3 **ppDb,/* OUT: sqlite db handle */
int flags,/* Flags */
const char *zVfs /* Name of VFS module to use */
);
------------------------------------------------------------------------
其中,sqlite3_open()、sqlite3_open16()方法当数据库文件不存在时依然返回true
因此,若需要判断数据库文件是否存在时应该选用sqlite3_open_v2()方法
------------------------------------------------------------------------
sqlite3_open_v2()中常用的flags包括:
sqlITE_OPEN_READONLY // 只读,文件不存在时返回false
sqlITE_OPEN_READWRITE // 读写,文件不存在时返回false
sqlITE_OPEN_CREATE // 文件不存在时则创建
以下几种情况会导致sqlite3_open_v2()返回false:
1. 指定的文件不存在
2. 指定的文件为非sqlite数据库文件
3. 指定的文件被加密
* 注意:由于空白文件能成功打开,如需要判断数据库是否为空,则可参考下述方法:
------------------------------------------------------------------------
QString sql = "select * from sqlite_master";
char **dataSet;
int nrow;
int ncolumn;
char *msg;
int ret;
std::string stdString = sql.toStdString();
const char *s = stdString.c_str();
// 若文件存在,则判断数据库中是否存在表/索引等
ret = sqlite3_get_table(db,s,&dataSet,&nrow,&ncolumn,&msg);
if (ret != sqlITE_OK)
{
qDebug() << "Msqlite3::open(): Database check error.";
return false;
}
if (nrow != 0)
{
qDebug() << "Msqlite3::open(): Database open success.";
isOpen = true;
return true;
}
else
{
qDebug() << "Msqlite3::open(): Database is empty.";
return false;
}
{
qDebug() << "Msqlite3::open(): Database open success.";
isOpen = true;
return true;
}
else
{
qDebug() << "Msqlite3::open(): Database is empty.";
return false;
}
...
------------------------------------------------------------------------
- 导入导出数据(CSV格式)
# sqlite3-csvtest.db"select*fromdata_table"> data.csv
# sqlite3 test.db ".import data.csv data_table"