SQLite3学习笔记5:INSERT(写)+ SELECT(读)数据(C API)

核心知识点

  1. INSERT 实现 :依然用sqlite3_exec,只需把 SQL 语句换成 INSERT 即可,和命令行语法完全一致;
  2. SELECT 实现sqlite3_execcallback参数是核心 ------SELECT 返回的每一行数据都会触发一次回调函数,通过回调函数处理查询结果(如存储到结构体 / 数组);
  3. 回调函数规则
    • 返回值: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

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

// 回调函数:处理SELECT查询结果(可改为存储到全局数组/结构体)
// 每查询到一行数据,该函数就会被调用一次
static int select_callback(void *data, int argc, char **argv, char **azColName)
{
    // data:用户传入的自定义提示信息(sqlite3_exec的第4个参数)
    printf("[%s]\n", (char *)data);

    // 遍历每一列,打印列名+值(可解析为对应类型,如param_value转float)
    for (int i = 0; i < argc; i++)
    {
        // argv[i]可能为NULL(字段为空),需做判空处理
        printf("  %s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");

    return 0; // 返回0:继续处理下一行;返回非0:终止查询
}

int main(int argc, char *argv[])
{
    sqlite3 *db   = NULL;
    char *err_msg = NULL;
    int ret       = 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. 插入数据(模拟传感器采集的温度/湿度数据)
    const char *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. 查询所有数据(调用回调函数处理结果)
    const char *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. 条件查询
    const char *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");

    return 0;
}

操作步骤

  1. 编译代码(必须链接 sqlite3 库):
bash 复制代码
gcc sqlite3_c_demo2.c -o sqlite3_c_demo2 -lsqlite3
  1. 运行程序:
bash 复制代码
./sqlite3_c_demo2

输出如下:

bash 复制代码
[INFO] 数据库打开成功
[INFO] 数据插入成功
[查询所有设备参数]
  id = 1
  param_name = temp
  param_value = 26.5
  update_ts = 2026-01-27 13:35:06
   
[查询所有设备参数]
  id = 2
  param_name = humidity
  param_value = 61.0
  update_ts = 2026-01-27 13:35:06
   
[查询温度参数]
  param_name = temp
  param_value = 26.5
   
[INFO] 数据库关闭成功
  1. 验证插入结果:
bash 复制代码
sqlite3 embedded_db.db "SELECT * FROM device_params;"

输出如下:

bash 复制代码
1|temp|26.5|2026-01-27 13:35:06
2|humidity|61.0|2026-01-27 13:35:06
相关推荐
A9better2 小时前
嵌入式开发学习日志50——任务调度与状态
stm32·嵌入式硬件·学习
四维碎片2 小时前
QSettings + INI 笔记
笔记·qt·算法
非凡ghost2 小时前
ESET NupDown Tools 数据库下载工具
学习·软件需求
zzcufo3 小时前
多邻国第5阶段17-18学习笔记
笔记·学习
BlackWolfSky3 小时前
鸿蒙中级课程笔记4—应用程序框架进阶1—Stage模型应用组成结构、UIAbility启动模式、启动应用内UIAbility
笔记·华为·harmonyos
中屹指纹浏览器3 小时前
指纹浏览器性能优化实操——多实例并发与资源占用管控
经验分享·笔记
brave and determined4 小时前
工程设计类学习(DAY9):印刷电路板(PCB)材料选择、工艺特性与制造技术综合详解
学习·制造·pcb·smt·工程设计·fr-4·pcb钻孔
-To be number.wan5 小时前
算法学习日记 | 枚举
c++·学习·算法
jrlong5 小时前
DataWhale大模型基础与量化微调task5学习笔记(第 3 章:大模型训练与量化_模型量化实战)
笔记·学习