博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLite数据库编程
阅读量:4286 次
发布时间:2019-05-27

本文共 1940 字,大约阅读时间需要 6 分钟。

转载自:

SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以”.”开头(如:mysql中查看当前有哪些数据库是“show databases”,而sqlite中是”.databases”)。当然,SQL语句都是一样的语法规则。

系统一般没有默认安装sqlite数据库,所以先要安装sqlite3:

# pacman -S sqlite3

可以使用”sqlite3 + 数据库名”来打开一个数据库。

常用函数

sqlite3_open(const char *filename, sqlite3 **ppDb); sqlite3_close(sqlite3 *db);sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**),  void *, char **errmsg);

这三个函数基本上能完成对sqlite3的所有操作。需要用的头文件为”sqlite3.h”。

打开(新建)数据库

sqlite3 *db; sqlite3_open("test.db", &db);

关闭数据库

sqlite3_close(db);

执行sql语句(以创建表为例)

char sql[128]; memset(sql, '\0', 128);sprintf(sql, "%s%s%s", "create table ", "test_tb", "(id INTEGER PRIMARY KEY, data TEXT)");sqlite3_exec(db, sql, NULL, NULL, NULL);

sqlite3_exec中第一个参数为数据库标识符,第二个参数为SQL命令字符串,第三个参数是一个回调(callback)函数,第四个参数可用于给回调函数传入一个参数,第五个参数为这条sql语句执行后的返回。

下面给个例子来看回调函数是怎么执行的:查询数据库中的一张表,并把表中的内容写到文件中。

#include 
#include
#include
/* callback函数中: * arg: 是从主函数传进来的参数 * values: 是查询结果的值 * names: 查询结果列的名字 */ int wf_callback(void *arg, int nr, char **values, char **names) { int i; FILE *fd; char str[128]; fd = (FILE *)arg; //将void *的参数强制转换为FILE * for (i=0; i

编译、运行结果如下图:

这里写图片描述
我们关注这里的回调函数wf_callback()。sqlite3_exec()函数先执行sql语句,如果sql语句的执行结果不为空,则调用回调函数进行处理。test文件中有3行数据,所以wf_callback()函数被调用了三次(这里我们也可以在回调函数中添加一个全局变量来计数,以查看回调函数是否多次被调用)。因为回调函数会被多次调用,所以这里在main函数中打开文件,把文件描述符以参数的形式传递给回调函数;否则,将fopen和fclose写到回调函数中,每调用一次回调函数,回调函数都会以“w”去打开文件,第二次调用回调函数的结果会覆盖第一调用回调函数的结果,使写入文件的内容不正确(只会在文件中写入最后一条记录)。

如果在查询语句中调用了SQL中的一些函数,如sum()等,也可以同样用回调函数来处理查询结果,如:

strcpy(sql, "select sum(id) from tb");  sqlite3_exec(db, sql, sum_callback, NULL, NULL);

则回调函数可以为:

int result;  int sum_callback(void *arg, int nr, char **values, char **names)  {      result = atoi(values[0]);      return 0;  }

然后再对result进行处理。当然,也可以不定义这个全局变量,而直接在回调函数里对result进行处理。需要注意的是,查询结果均为字符数组形式的,所以如果需要的结果是int型或者float型,则需要相应的函数来转换,如atoi(),atof()等。

你可能感兴趣的文章
一些库函数的使用注意事项
查看>>
IPv6地址自动配置中的有状态(stateful)和无状态(stateless)的区别
查看>>
阿里云 ACP 云安全 题库总结
查看>>
阿里云 ACP 云安全 题库 -- 数据库审计部分
查看>>
GC 回收机制
查看>>
探究 Android MVC、MVP、MVVM 的区别以及优缺点
查看>>
深入分析 Handler 内存泄露
查看>>
解决 windows 文件被占用的问题 -- The action can‘t be completed because the folder is open in another program
查看>>
Tencent/matrix错误:Cause: need sign apk but apksigner *\Sdk/build-tools/*/apksigner was not exist
查看>>
Android6.0运行时权限详解
查看>>
Android 开机启动过程
查看>>
View 的事件分发机制(一)
查看>>
Android 面试题整理(一)
查看>>
Android 项目中打印Log的优化
查看>>
Github 客户端安装失败解决办法
查看>>
android studio:###Error:Dependency :common:unspecified on project resource resolves to an APK
查看>>
异常统一处理的一些思路
查看>>
Android studio中快速try catch的快捷键
查看>>
Dialog 和 Toast
查看>>
队列在Http请求中的一点理解
查看>>