SQLite3
SQLite是一个轻量级的数据库。和常用的MySQL大同小异。和MySQL相比,数据类型基本一样,只是sqlite的指令都是以"."开头
(如:mysql中查看当前有哪些数据库是“show
databases",而sqlite中是".databases")。当然,SQL语句都是一样的语法规则。
-
Host System: Archlinux
-
gcc: 4.6.1 20110819
-
sqlite3: 3.7.8 20110919
系统一般没有默认安装sqlite数据库,所以先要安装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);
-
关闭数据库
-
执行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中第一个和第二个参数的意义很好理解。第三个参数是一个回调(callback)函数。第四个参数可用于给回调函数传入一个参
数。第五个参数为这条sql语句执行后的返回。我试了好几次,第五个参数的返回值打印出来都是乱码,所以建议直接查看sqlite3_exec函数的返回
指,它返回一个整型的数,可以通过这个数字来得知的执行结果。
下面给个例子来看回调函数是怎么执行的:查询数据库中的一张表,并把表中的内容写到文件中。
-
#include
-
#include
-
#include
-
-
-
-
-
-
-
int wf_callback(void *arg, int nr, char **values, char **names)
-
{
-
int i;
-
FILE *fd;
-
char str[128];
-
fd = (FILE *)arg;
-
for (i=0; i
-
memset(str, '\0', 128);
-
sprintf(str, "\t%s\t", values[i]);
-
fwrite(str, sizeof(char), sizeof(str), fd);
-
}
-
memset(str, '\0', 128);
-
fwrite("\n", sizeof(char), 2, fd);
-
return 0;
-
}
-
-
-
int main()
-
{
-
char sql[128];
-
sqlite3 *db;
-
FILE *fd;
-
-
sqlite3_open("test.db", &db);
-
memset(sql, '\0', 128);
-
-
strcpy(sql, "create table tb(id INTEGER PRIMARY KEY, data TEXT)");
-
sqlite3_exec(db, sql, NULL, NULL, NULL);
-
-
-
fd = fopen("test", "w");
-
fwrite("Result: \n", sizeof(char), 10, fd);
-
memset(sql, '\0', 128);
-
strcpy(sql, "select * from tb");
-
sqlite3_exec(db, sql, wf_callback, fd, NULL);
-
fclose(fd);
-
-
sqlite3_close(db);
-
return 0;
-
}
编译、运行结果如下图:
我们关注这里的回调函数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()等。
原文地址:
阅读(1338) | 评论(0) | 转发(0) |