背景
由于项目中使用sqlite,而且使用的比较频繁,虽然有别人的项目中的例子作为参考,但是,自己不熟悉毕竟心理没有底,趁这个机会,好好学习一下。虽然这个数据库是很小的,但是要想用好它,也必须好好研究一番,网上的例子都是些小儿科。在此,以官网的doc为例,增删改查挨个测试一遍,以经典的学生信息为例吧
API
创建数据库
打开一个数据库,没有的话,就创建。使用的API为:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
打开成功后返回一个句柄,返回值为:SQLITE_OK。失败的情况只有一种情况,就是没有申请到足够的内存。
例如:
int ret = -1;
sqlite3 *db = NULL;
ret = sqlite3_open("my.db", &db);
if (ret != SQLITE_OK) {
printf("open database failed.\n");
return -1;
}
待确认的几点:
- 打开失败后,需不需要关闭?
- 打开属性是什么样的,只读、只写、可读可写等。由于没有该flag作为参数,那么默认是什么呢?
成功打开数据库之后,不使用或后续的命令出错等,需要关闭数据库的。
int sqlite3_close(sqlite3*);
关闭还是比较简单,传入的唯一参数就是打开时返回的那个数据库的句柄。需要注意的是,关闭时,如果还有没有完成的事务,会返回SQLITE_BUSY。正常返回SQLITE_OK。
待确认:
- 该函数的返回值需不需要检测?如何检测?
执行SQL
我们使用的SQL文本是不能直接被sqlite识别并使用的,需要转变成对应的声明对象方可。官网文档的比喻,可以把声明对象想象为一个程序,SQL文本类似于源码,需要通过把SQL文本编译成声明对象,sqlite才能识别并运行它。
声明对象的原型:
typedef struct sqlite3_stmt sqlite3_stmt;
而负责转换的函数为:
int sqlite3_prepare_v2(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
类似函数还有几个,官方更推荐使用这个。该函数的功能就是把SQL文本(zSql)转换成声明对象(ppStmt)。
但是,该SQL语句还是没有被执行的,执行的函数为:
int sqlite3_step(sqlite3_stmt*);
调用该函数需要判断返回值,并对执行结果一行行的处理,直到返回值为SQLITE_DONE为止。对应该函数还是不太理解如何用,特别是select的时候,貌似是一次只能查询一行。
执行完后,需要把声明对象销毁的,使用的函数为:
int sqlite3_finalize(sqlite3_stmt *pStmt);
该函数和sqlite3_prepare_v2是对应起来的,如new和delete。
另外,还有一个查询使用的函数sqlite3_get_table,官方不推荐使用了,不再赘述。
最后有个使用比较广泛的函数:
int sqlite3_exec(
sqlite3*, /* An open database */
const char *sql, /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**), /* Callback function */
void *, /* 1st argument to callback */
char **errmsg /* Error msg written here */
);
这个函数是sqlite3_prepare_v2(),sqlite3_step(),sqlite3_finalize()这三个函数的封装,并且可以执行多条SQL语句。
参考
https://blog.csdn.net/xiaoaid01/article/details/17998013
https://www.sqlite.org/c3ref/column_blob.html
https://www.runoob.com/sqlite/sqlite-c-cpp.html
https://blog.csdn.net/fangye945a/article/details/86484547?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/zouleideboke/article/details/73649886