sqlite3 研究一

背景

由于项目中使用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

猜你喜欢

转载自blog.csdn.net/donglicaiju76152/article/details/118224551