Sqlite3一些常用函数的分析与自己理解

本文详细介绍了SQLite3数据库中几个常用函数的功能与用法,包括sqlite3_open用于打开数据库,sqlite3_exec执行SQL语句,以及回调函数的使用,还有sqlite3_get_table用于获取查询结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于sqlite3的一些函数
1、int sqlite3_open(const char * filename, sqlite3 **ppDb)
filename:需要打开的数据库的文件名
ppDb:一个数据库连接句柄被返回到这个参数。即是发生错误,唯一的异常是如果sqlite不能分配内存来存放sqlite对象,ppDb会返回一个NULL值。——跟文件句柄FILE很相似
句柄在很多地方我们见到过,最常见的就是文件的句柄,我们要操作一个文件,我们就要取得一个文件的句柄。
句柄是什么东西呢?
其实很简单,句柄是一个东西的描述,它被定义为一个结构体,这个结构会包含这个东西的具体信息,比图位置,大小,类型。我们有了这个描述信息就能去找到这个东西
返回值是什么?
返回值int是成果返回SQLITE_OK,也就是0,错误返回其他值。



打开之后,如果需要继续操作,要在数据库中建立表,涉及到一个函数sqlite3_exec()

2、sqlite3_exec()执行非查询的sqlite3语句
int sqlite3_exec(
sqlite3 *ppDb,   //an open database   open函数中返回的数据库句柄
const char *sql, //SQL to bei evalutated   执行的sql语句
sqlite_callback   //  callback  回调功能
void *para,         // 1st argument to callback    用户传入的参数,可以为NULL,该参数最后被传入回调函数以便在回调函数里使用
char **errMsg   //errMsg  write here返回错误信息,注意是指针的指针
);

exec()接口执行0或者多个UTF-8编码的,分号分割的sql语句,传到第二个参数中,
如果sqlite3_exec的第三个函数指针不为空,他会为每个来自执行的SQL语句行调用(也就是说回调函数会调用多次,上面例子中会返回2个结果行,因而会执行2次),
第4个参数是传给调函数的第一个参数
如果回调函数指针为空,那么回调不会发生,同时结果行被忽略
如果在执行sql语句的时候有错误发生,那么当前的语句的执行被停止,后续的语句也被跳过。
第五个参数不为空的时候,它被分配内存并写入了错误信息,所以在sqlite3_exec后面要调用sqlite3_free去释放这个对象防止内存泄露。

4、回调函数
typedef  int (*sqlite_callback)(
void *para,                              //输入参数para,从sqlite3_exec()传入的参数制作
int columnCount,                   //表的列数
char **columnValue,              //指向查询结果的指针数组
char **columnName              //指向表头明的指针数据
);             
参数格式:
传给sqlite3_exec的回调函数,用来显示查询结果
对没一条查询结果调用该函数
参数para:由sqlite3_exec传递的初始化函数
columnCount表的列数
coloumnValue:表头的列数
cololumnName:指向表头的数组指针
返回值:
1:中断查找
0:继续例举查询的数据
int LoadMyInfo(void *para,char *ncolumn,char **columnvalue,char **columnname)
{
    //para是你在sqlite3_exec例传入的void *参数
    //通过para参数,你可以传入一些特殊的指针(比如类指针、结构指针),然后再这里面强制转换成对应的类型(这里是void *类型,必须强制转换成你的类型才可用)
    //ncolumn是这一条记录有多少个字段
   //columnvalue是关键值,查出来的数据都保存在这里,实际上是一个1维数组,每个元素都是char *类型
   //columnname与columnvalue对应
   //这里我不适用para参数,忽略它的存在
   int i;
    printf("total column %d",ncolumn);
    for(i = 0;i < ncolumn;i++)
{
    printf("columnname:%s   columnvalue:%s\n",coumnname[i],columnvalue[i]);
}
    printf("-------------------------------------\n");
    return 0;
}
示例表:
id    pic   data
1    a.jpg     00  00  00
2    b.jpg     xx  xx   xx
对第一行数据:argc = 3,即[0]...[2]
argv[0] = "0", agrv[1] = "a.jpg",argv[2] = "00  00 00 .."
col[0] = "id",col[1] = "pic",col[2] = "data"
说明:sqlite3_exec()的回调函数必须按照此格式,当然形参的名字任意。
例子:
打开数据库成功后,创建了mytable_1。
使用
result = sqlite3_exec(db,"insert into mytable_1(name)Values('走路'),NULL,NULL,&errmsg");
result = sqlite3_exec(db,"insert into mytable_1(name)Values('汽车'),NULL,NULL,&errmsg");
result = sqlite3_exec(db,"insert into mytable_1(name)Values('乘车'),NULL,NULL,&errmsg");
最后用
result = sqlite3_exec(db,"select *from mytable_1",LoadMyInfo,NULL,errmsg);
查询表的内容
每查询一次,调用一次,里面有三条记录,就会调用3次。

sqlite3_exec是使用回调来执行对select结果的操作。还有一个方法直接查询不需要回调。我个人感觉还是回调号,因为代码可以更加整齐,只不过回调很麻烦,你得声明一个函数
3、sqlite3_get_table(
sqlite3 *db,          //an open database  
const char *sql,    //SQL to be evaluated
char ***azresult,   //result of the query   查询结果,依然是一维数组。(不要以为是二维数组或者三维)内存布局是:字段名称,后面紧接着是每个字段的值
char *nrow,          //number of result rows written here   查询出多少条记录
char *ncolumn,    //number of columns written here     查询出多少个字段
char **errmsg,      //error msg written here                   错误信息
)
azresult返回的字符数量实际上是(*nrow + 1)*(*ncolumn),因为前面有字段名
void sqlite3_free_table(char **result);


所以显示全部数据有两个做法:
①不调用回调函数
sqlite3_get_table(sqlite3 *db,const char *sql,char ***azresult,char *n row,char *ncolumn,char **errmsg );
②调用回调函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值