在写这篇文章之前大家先了解我之前写的关于用c语言操作sqlite3的博客,链接地址如下:
https://blog.csdn.net/makunIT/article/details/105192076
关于sqlite3_exec的回调函数的知识,我也是在做一个项目中学习到的,看了一些博客吧,很多博客,都表达的不是很清楚,所以我想写这篇博客,记录自己的学习过程。大家先了解一下sqlite3_exec()函数吧。
1、sqlite3_exec()
函数原型
#include <sqlite3.h>
int sqlite_exec(sqlite *db,
const char *sql,
int (*callback)(void *,int,char **,char **),
void *,
char **errmsg);
①函数说明:用来执行sql语句,查询的结果返回给回调函数callback。
②参数说明:
第一个参数:db是用于保存打开的数据库文件dbname的信息;
第二个参数:sql你要执行命令的语句;
第三个参数:callback,回调函数,用来处理查询结果,如果不需要回调(比如做insert 或者delete 操作时),可以输入NULL;
第四个参数:void *是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL;
第五个参数:errmsg,返回错误信息,注意是指针的指针。
③返回值:执行成功返回SQLITE_OK,否则返回其他值
说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select查询。这可以通过sqlite3_get_table 函数做到。
那么了解了以上sqlite3_exec()函数,那么我下面将讲解一下sqlite_exec()的参数回调函数callback
2、sqlite3_exec()的回调函数callback
在了解callback之前,我们先了解一下什么是回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数;
那么在sqlite3_exec中,我们应该这样理解先执行*sql对应的功能命令,然后将结果传递给回调函数,回调函数根据结果再进一步执行。这代表着,这个 “回调函数”才是最有意义的,我们要讲我们需要的功能,通过回调函数来实现,不管是获取数据库表中有效信息,还是其他动作。
函数原型:
typedef int(*sqlite_callback)(void* para,
int columenCount,
char** columnValue,
char** columnName);
①函数说明:由用户处理查询的结果;
②参数说明:
第一个参数:para: 由sqlite3_exec传入的参数指针,或者说是指针参数;
第二个参数:columnCount: 查询到的这一条记录由多少个字段(多少列);
第三个参数:columnValue : 查询出来的数据都保存在这里,它实际上是个1 维数组(不要以为是2 维数组),每一个元素都是一个char * 值,是一个字段内容(用字符串来表示,以‘\0’结尾);
第四个参数:columnName : 该参数是双指针,语columnValue是对应的,表示这个字段的字段名称;
③返回值:执行成功返回SQLITE_OK,否则返回其他值
说明:回调函数多数时候不是执行1次,而是会循环执行n次,当我们使用select进行sql功能时,往往输出的结果会是 多行,那么 有n行,就会执行n次的 回调函数
下面我将会写两段代码,来实现回调函数,一种是直接用insert直接插入到db表中,一种是用snprintf()函数来实现向表中插入数据的。大家先来看第一种吧
第一种的代码:
/*********************************************************************************
* Copyright: (C) 2020 makun<1394987689@qq.com>
* All rights reserved.
*
* Filename: sqlite_delete.c
* Description: This file
*
* Version: 1.0.0(2020年03月27日)
* Author: makun <1394987689@qq.com>
* ChangeLog: 1, Release initial version on "2020年03月27日 00时47分05秒"
*
********************************************************************************/
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
static int callback(void *data, int argc, char **argv, char **azColName);
int main (int argc, char **argv)
{
sqlite3 *db=NULL;
int rc ;
char *zerrmsg=0;
char *sql;
char *data= "callback function called";
//1、创建数据库,如果存在则打开
/***********************************************************************************************************************/
rc = sqlite3_open("sqlite.db",&db);
if(rc)
{
printf("create sqlite failure:%s\n",sqlite3_errmsg(db));
exit(1);
}
printf("create sqlite successfuly\n");
//2、创建数据库表
/*******************************************************************************