Sqlite   发布时间:2022-05-22  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SQLite 数据库使用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

SQLite 数据库使用

一、SQLite 数据库的安装(sqlite-3.5.6,Ubuntu)
1. wgethttp://www.sqlite.org/sqlite-3.5.6.tar.gz
2. tar -xzvfsqlite-3.5.6.tar.gz
3. cdsqlite-3.5.6
4. ./configure
5. make
6. make install

测试安装是否成功:
# ./sqlite3 text.db

如果安装成功,会出现下面这样的信息

sqlite version 3.5.6
Enter ".Help" for instructions
sqlite>

二、SQLite 数据库介绍
sqlite 是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(Nosql),如 BerkeleyDB、@R_325_5675@ 等,sqlite 可以很好的支持关系型数据库所具备的一些基本特征,如标准 sql 语法、实务、数据表和索引等。事实上,尽管 sqlite 拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。下面是 sqlite 的主要特征:
1). 管理简单,甚至可以认为无需管理。
2). 操作方便sqlite 生成的数据库文件可以在各个平台无缝移植。
3). 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。
4). 易于维护。
综上所述,sqlite 的主要优势在与灵巧、快速和可靠性高sqlite 的设计者为了达到这一目标,在功能上作出了很关键性的取舍,与此同时,也失去了一些对 RDBMS 关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的 sql 语句等。正式因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。

三、SQLite 数据库核心对象和接口
1. 核心对象:
在 SQLite 中最主要的两个对象是,database_connection 和 prepared_statement。database_connection 对象是由sqlite3_open() 接口函数创建并返回的,在应用程序使用任何其他 sqlite 接口函数之前,必须先调用该函数以便获得 database_connnection 对象,在随后的其他 APIs 调用中,都需要该对象作为输入参数以完成相应的工作。至于 prepare_statement,我们可以简单的将它视为编译后的 sql 语句,因此,所有和 sql 语句执行相关的函数也都需要该对象作为输入参数以完成指定的 sql 操作。

2. 核心接口:
1).sqlite3_open
上面已经提到过这个函数了,它是操作 SQLite 数据库的入口函数。该函数返回的 database_connection 对象是很多其他 sqlite APIs 的句柄参数。注意,我们通过该函数既可以打开已经存在的数据库文件,也可以创建新的数据库文件。对于该函数返回的 database_connection 对象,我们可以在多个线程之间共享该对象的指针,以便完成和数据库相关的任意操作。然而在多线程情况下,我们更为推荐的使用方式是,为每个线程创建独立的 database_connection 对象。对于该函数还有一点也需要额外说明,我们没有必要为了访问多个数据库而创建多个数据库连接对象,因为通过 sqlite 自带的 ATTACH 命令可以在一个连接中方便的访问多个数据库。

2).sqlite3_prepare
该函数将 sql 文本转换为 prepared_statement 对象,并在函数执行后返回该对象的指针。事实上,该函数并不会评估参数指定 sql 语句,它仅仅是将 sql 文本初始化为待执行的状态。最后需要指出的,对于新的应用程序我们可以使用sqlite3_prepare_v2 接口函数来替代该函数以完成相同的工作。

3).sqlite3_step
该函数用于评估sqlite3_prepare 函数返回的 prepared_statement 对象,在执行完该函数之后,prepared_statement 对象的内部指针将指向其返回的结果集的第一行。如果打算进一步迭代其后的数据行,就需要不断的调用该函数,直到所有的数据行都遍历完毕。然而对于 INSERT、updatE 和 deletE 等 DML 语句,该函数执行一次即可完成。

4).sqlite3_column
该函数用于获取当前行指定列的数据,然而严格意义上讲,此函数在 sqlite 的接口函数中并不存在,而是由一组相关的接口函数来完成该功能,其中每个函数都返回不同类型的数据,如:
sqlite3_column_blob
sqlite3_column_bytes
sqlite3_column_bytes16
sqlite3_column_double
sqlite3_column_int
sqlite3_column_int64
sqlite3_column_text
sqlite3_column_text16
sqlite3_column_type
sqlite3_column_value
sqlite3_column_count
其中sqlite3_column_count 函数用于获取当前结果集中的字段数据。下面是使用sqlite3_step 和sqlite3_column 函数迭代结果集中每行数据的伪代码,注意这里作为示例代码简化了对字段类型的判断:

int fIEldCount =sqlite3_column_count(...);
while (sqlite3_step(...) <> EOF)
{
for (int i = 0; i < fIEldCount; ++i)
{
int v =sqlite3_column_int(...,i);
}
}

5).sqlite3_finalize
该函数用于销毁 prepared statement 对象,否则将会造成内存泄露。

6).sqlite3_close
该函数用于关闭之前打开的 database_connection 对象,其中所有和该对象相关的 prepared_statements 对象都必须在此之前先被销毁。

3.执行 query:
函数sqlite3_exec() 提供了一种 sql 命令的快速、简单的方法,它特别适合处理对数据库的修改操作(不需要返回数据),如:INSERT、updatE 和 deletE。

intsqlite3_exec(sqlite3*,const char *sql,sqlite3_callBACk,void *,char **errmsg );

第 1 个参数不再说了,是前面 open 函数得到的指针。说了是关键数据结构。
第 2 个参数 const char *sql 是一条 sql 语句,以 /0 结尾。
第 3 个参数sqlite3_callBACk 是回调,当这条语句执行之后,sqlite3 会去调用你提供的这个函数。
第 4 个参数 void * 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填 NulL。
第 5 个参数 char ** errmsg 是错误信息,注意是指针的指针,sqlite3 里面有很多固定的错误信息。执行sqlite3_exec 之后,执行失败时可以查阅这个指针(直接 printf(“%s/n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec 函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec 函数外面就可以通过这个 char* 得到具体错误提示。
说明:通常,sqlite3_callBACk 和它后面的 void * 这两个位置都可以填 NulL。填 NulL 表示你不需要回调。比如你做 insert 操作,做 delete 操作,就没有必要使用回调。而当你做 SELEct 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。

sqlite3_exec() 的回调函数:
typedef int (*sqlite3_callBACk)(
void*,/* Data provIDed in the 4th argument ofsqlite3_exec() */
int,/* the number of columns in row */
char**,/* An array of Strings represenTing fIElds in the row */---- 字段值
char** /* An array of Strings represenTing column names */ ---- 字段名

);



之前参过网上几篇不错的文章,但是现在没记起来是哪些,也没去翻了,请见谅。


http://www.cnblogs.com/stephen-liu74/archive/2012/03/09/2328757.html这是 sqlite 学习的一个不错的网站,里面还有实例。


sqlite可以在sHell底下直接执行命令:
sqlite3 film.db "SELEct * from film;"
输出 HTML 表格:
sqlite3 -HTML film.db "SELEct * from film;"
将数据库「倒出来」:
sqlite3 film.db ".dump" > output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就
sqlite中运行 .sql 脚本:sqlite3 test.db < /var/waf/rules.sql

如果向sqlite3数据库中插入大量数据,速度会比较慢,这个时候可以进行优化,方式有两种:
1. 使用事务:(sql脚本)
BEGIN transaCTION;
INSERT INTO "rules" VALUES(1,..);
INSERT INTO "rules" VALUES(2,..);
........
INSERT INTO "rules" VALUES(1000000,..);
COMMIT transaCTION;

2. 设置 synchronous 标志:
PRAGMA synchronous = OFF; (放在sql文件的头部)

如果是python,使用事务就很简单了,只要在最后加上 conn.commit() 即可。如果直接在sHell下运行,就用begin;commit; 即可。

注意:

1. sqlite3_exec函数如果有返回错误信息,也就是第5个参数返回不为空,那就需要调用sqlite3_free函数去释放第5个参数的指针。

2.sqlite3_mprintf函数拼接完sql语句后也需要调用sqlite3_free函数去释放保存sql语句的空间。

3.sqlite3_column_text函数从数据库中获取字符串字段后,不需要调用sqlite3_free函数去释放保存字符串的空间,这块内存由sqlite3自己释放。

http://www.sqlite.org/capi3ref.html#sqlite3_exec

http://www.sqlite.org/capi3ref.html#sqlite3_mprintf

http://www.sqlite.org/c3ref/column_blob.html

大佬总结

以上是大佬教程为你收集整理的SQLite 数据库使用全部内容,希望文章能够帮你解决SQLite 数据库使用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: