核心知识点
- INSERT 实现:依然用
sqlite3_exec,只需把 SQL 语句换成 INSERT 即可,和命令行语法完全一致; - SELECT 实现:
sqlite3_exec的callback参数是核心 ——SELECT 返回的每一行数据都会触发一次回调函数,通过回调函数处理查询结果(如存储到结构体 / 数组); - 回调函数规则
- 返回值:
0表示继续处理下一行,非 0 表示终止查询; - 参数 1(
void* data):用户自定义数据(sqlite3_exec的第 4 个参数); - 参数 2(
int argc):结果集的列数(比如 device_params 有 4 列,argc=4); - 参数 3(
char** argv):每列的数值(字符串形式,需手动转换类型,如 REAL 转 float); - 参数 4(
char** azColName):每列的列名(调试 / 日志用)。
- 返回值:
完整 C 代码示例
创建文件sqlite3_c_demo2.c:
#include<stdio.h>#include<stdlib.h>#include<sqlite3.h>// 回调函数:处理SELECT查询结果(可改为存储到全局数组/结构体)// 每查询到一行数据,该函数就会被调用一次staticintselect_callback(void*data,intargc,char**argv,char**azColName){// data:用户传入的自定义提示信息(sqlite3_exec的第4个参数)printf("[%s]\n",(char*)data);// 遍历每一列,打印列名+值(可解析为对应类型,如param_value转float)for(inti=0;i<argc;i++){// argv[i]可能为NULL(字段为空),需做判空处理printf(" %s = %s\n",azColName[i],argv[i]?argv[i]:"NULL");}printf("\n");return0;// 返回0:继续处理下一行;返回非0:终止查询}intmain(intargc,char*argv[]){sqlite3*db=NULL;char*err_msg=NULL;intret=SQLITE_OK;// 1. 打开数据库ret=sqlite3_open("embedded_db.db",&db);if(ret!=SQLITE_OK){fprintf(stderr,"[ERROR] 打开数据库失败: %s\n",sqlite3_errmsg(db));sqlite3_close(db);return-1;}printf("[INFO] 数据库打开成功\n");// 2. 插入数据(模拟传感器采集的温度/湿度数据)constchar*insert_sql="INSERT INTO device_params (param_name, param_value, update_ts) VALUES ""('temp', 26.5, datetime(CURRENT_TIMESTAMP, '+8 hours')), ""('humidity', 61.0, datetime(CURRENT_TIMESTAMP, '+8 hours'));";ret=sqlite3_exec(db,insert_sql,NULL,NULL,&err_msg);if(ret!=SQLITE_OK){fprintf(stderr,"[ERROR] 插入数据失败: %s\n",err_msg);sqlite3_free(err_msg);sqlite3_close(db);return-1;}printf("[INFO] 数据插入成功\n");// 3. 查询所有数据(调用回调函数处理结果)constchar*select_all_sql="SELECT * FROM device_params;";ret=sqlite3_exec(db,select_all_sql,select_callback,(void*)"查询所有设备参数",&err_msg);if(ret!=SQLITE_OK){fprintf(stderr,"[ERROR] 查询所有数据失败: %s\n",err_msg);sqlite3_free(err_msg);sqlite3_close(db);return-1;}// 4. 条件查询constchar*select_temp_sql="SELECT param_name, param_value FROM device_params WHERE param_name = 'temp';";ret=sqlite3_exec(db,select_temp_sql,select_callback,(void*)"查询温度参数",&err_msg);if(ret!=SQLITE_OK){fprintf(stderr,"[ERROR] 查询温度失败: %s\n",err_msg);sqlite3_free(err_msg);sqlite3_close(db);return-1;}// 5. 关闭数据库ret=sqlite3_close(db);if(ret!=SQLITE_OK){fprintf(stderr,"[ERROR] 关闭数据库失败: %s\n",sqlite3_errmsg(db));return-1;}printf("[INFO] 数据库关闭成功\n");return0;}操作步骤
- 编译代码(必须链接 sqlite3 库):
gcc sqlite3_c_demo2.c -o sqlite3_c_demo2 -lsqlite3- 运行程序:
./sqlite3_c_demo2输出如下:
[INFO]数据库打开成功[INFO]数据插入成功[查询所有设备参数]id=1param_name=temp param_value=26.5update_ts=2026-01-2713:35:06[查询所有设备参数]id=2param_name=humidity param_value=61.0update_ts=2026-01-2713:35:06[查询温度参数]param_name=temp param_value=26.5[INFO]数据库关闭成功- 验证插入结果:
sqlite3 embedded_db.db"SELECT * FROM device_params;"输出如下:
1|temp|26.5|2026-01-2713:35:062|humidity|61.0|2026-01-2713:35:06