嵌入式linux学习之sqlite3的使用

两盒软妹~` 提交于 2020-03-07 04:53:53

一、编译sqlite3

下载sqlite3的源代码进行编译,这个比较简单,我使用的芯片只能使用静态库,所以使用编译出来的静态库,以及头文件。在这里插入图片描述

二、应用

sqlite3网上有许多总结,我推荐我之前学习参考的链接,写得比较全:
sqlite3使用总结

以下是我使用的笔记:

sqlite3 *db=NULL;
sqlite3_open(xxx, &db);

xxx: 数据库文件名,绝对路径,若不存在的话会创建文件。
db:sqlite3的关键结构指针,类似于句柄。

char *zErrMsg = 0;
sqlite3_errmsg(db)

zErrMsg:创建一个指向错误信息的指针。
sqlite3_errmsg:返回错误信息的函数。

char *sql;
int rc;
sql = "SELECT * from xxx";
rc = sqlite3_exec(db, sql, sqlite3_callback,"", &zErrMsg);
if( rc != SQLITE_OK ){
		fprintf(stderr, "SQL error: %s\n", zErrMsg);
		sqlite3_free(zErrMsg);

sql:操作数据库的语句,查询数据库中的对应表。
sqlite3_callback:执行了sql语句后会去调用这个回调函数。
第四个参数是将出指针参数传递到回调函数里。
zErrMsg:错误信息。打印完可以释放这块内存。

int sqlite3_callback(void *data, int argc, char **argv, char **azColName)

回调函数的格式定义是固定的,每查询到一条记录(一行)都会调用一次回调函数,在回调函数中可以对查询到的数据进行操作:
data:在exec中传入的参数。
argc:这条记录的列数。
argv:字段的值,即内容,是一个一维数组,argv[a]则是第[a-1]列的内容。
azColName:对应于argv的该字段名称。

sqlite3_close(db);

关闭数据库。

另外,还用到了:

sql = sqlite3_mprintf("UPDATE xxx set value='%s' where did='%s',,);
rc = sqlite3_exec(db, sql, 0,0, &zErrMsg);

用这个语句更新数据库某一段的值,where后面跟上条件,条件与条件之间用“and”隔开。

sql=sqlite3_mprintf("insert into xxx (a,b,c) values(A,B,C)"); 

xxx为表名,a、b、c为表中的字段名,A、B、C对应字段名的字段值。用这个语句插入数据。

sql=sqlite3_mprintf("delete from xxx");

用这个语句删除表xxx。


在使用sqlite的时候,发现有一定几率出现锁表的情况,这是在并发写数据库的时候出现的问题。可以通过事务的方式读写表,或者使用sqlite3_busy_handler()和sqlite3_busy_timeout()这两个函数,在sqlite3_open()之后使用。

int sqlite3_busy_handler(sqlite3 *, int (*)(void *, int), void *)
int sqlite3_busy_timeout(sqlite3*, int ms);

可参考如下链接的解决办法。

sqlite3解决锁表问题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!