大佬教程收集整理的这篇文章主要介绍了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 */ ---- 字段名
|
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 |
注意: 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
如果向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; 即可。
以上是大佬教程为你收集整理的SQLite 数据库使用全部内容,希望文章能够帮你解决SQLite 数据库使用所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。