

















逐段拆解 SQLite 这两个核心接口,通俗讲明白
一、先看懂第一行:回调函数类型定义
c
typedef int (*sqlite3_callback)(void *, int, char **, char **);
拆开翻译
typedef:给复杂类型起别名,简化代码int (*xxx)(...):这是函数指针类型
代表:一个函数,返回值是int,参数固定4个:void *:自定义传参,你外面随便传数据进来int:当前这一行查询结果有多少列char **:当前行每一列的数据(字符串数组)char **:每一列的字段名(表头)
回调函数作用
只有执行SELECT查询语句 时才会触发:数据库每查到一行数据,就自动调用一次这个函数,你在里面写代码处理查到的数据(打印、存变量等)。
如果是建表/插入/删除,没有查询结果,回调不会执行,可以填NULL。
举个最简单的回调示例
c
// 符合 sqlite3_callback 格式的回调函数
int myCallback(void* arg, int colNum, char** colData, char** colName)
{
// 遍历一行所有列
for(int i=0; i<colNum; i++)
{
printf("%s = %s | ", colName[i], colData[i]);
}
printf("\n");
return 0;
}
二、第二个核心函数:sqlite3_exec
c
int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
逐个参数大白话解释
sqlite3 *db数据库句柄
打开数据库时拿到的指针,相当于数据库的"钥匙",用来指定操作哪个数据库文件。const char *sqlSQL语句字符串
写你要执行的命令:CREATE TABLE、INSERT、SELECT、DELETE等。sqlite3_callback callback回调函数指针
查询语句填刚才写好的回调函数名;
增删改、建表无返回数据,直接填NULL。void *自定义参数(传给回调第一个参数)
你想往回调里传什么数据就填什么,不用就填NULL。char **errmsg错误信息输出
传一个char*变量的地址,如果SQL执行失败,SQLite会在这里分配内存存错误文本;
成功执行则不会赋值。用完必须调用sqlite3_free()释放这段内存,否则内存泄漏。
返回值
0:执行成功- 非0数字:执行失败,对应具体错误码,错误详情存在
errmsg里
三、完整可运行极简示例(一看就懂)
c
#include <stdio.h>
#include "sqlite3.h"
// 定义查询回调
int printData(void* arg, int colCnt, char** data, char** name)
{
for(int i=0; i<colCnt; i++)
{
printf("%s:%s ", name[i], data[i]);
}
puts("");
return 0;
}
int main()
{
sqlite3* db;
char* err = NULL;
// 1. 打开数据库 test.db
sqlite3_open("test.db", &db);
// 2. 建表语句,无查询,回调填NULL
const char* createSql = "CREATE TABLE IF NOT EXISTS user(id INT, name TEXT);";
sqlite3_exec(db, createSql, NULL, NULL, &err);
// 3. 插入数据
const char* insertSql = "INSERT INTO user VALUES(1,'小明');";
sqlite3_exec(db, insertSql, NULL, NULL, &err);
// 4. 查询语句,需要传回调接收数据
const char* selectSql = "SELECT * FROM user;";
sqlite3_exec(db, selectSql, printData, NULL, &err);
// 释放错误信息内存
if(err != NULL)
{
sqlite3_free(err);
}
// 关闭数据库
sqlite3_close(db);
return 0;
}
四、核心总结
sqlite3_callback:规定查询结果处理函数的固定格式,每一行数据触发一次;sqlite3_exec:万能执行函数,所有SQL都靠它跑;- 增/删/改/建表:回调填
NULL; - SELECT查询:必须传入回调函数接收查到的数据;
- 增/删/改/建表:回调填
errmsg是输出型参数,用来拿报错文字,用完要释放内存;- 返回0代表执行成功,非0代表SQL出错。
