一、编译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);
可参考如下链接的解决办法。
来源:CSDN
作者:α少年
链接:https://blog.csdn.net/sinat_41785418/article/details/104695297