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
相关推荐
羊群智妍7 小时前
2026 AI搜索流量密码:免费GEO监测工具,优化效果看得见
笔记·百度·微信·facebook·新浪微博
阿蒙Amon7 小时前
TypeScript学习-第10章:模块与命名空间
学习·ubuntu·typescript
AI绘画哇哒哒8 小时前
【干货收藏】深度解析AI Agent框架:设计原理+主流选型+项目实操,一站式学习指南
人工智能·学习·ai·程序员·大模型·产品经理·转行
ggabb8 小时前
中文的全息之美:字音藏道,字里见宇宙
sqlite
戌中横8 小时前
JavaScript——预解析
前端·javascript·学习
●VON9 小时前
React Native for OpenHarmony:2048 小游戏的开发与跨平台适配实践
javascript·学习·react native·react.js·von
山岚的运维笔记9 小时前
SQL Server笔记 -- 第18章:Views
数据库·笔记·sql·microsoft·sqlserver
ZH15455891319 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
xcLeigh9 小时前
Python入门:Python3 requests模块全面学习教程
开发语言·python·学习·模块·python3·requests
xcLeigh9 小时前
Python入门:Python3 statistics模块全面学习教程
开发语言·python·学习·模块·python3·statistics