前置知识(C API 核心)
- 编译依赖 :Ubuntu 下编译 C 代码必须链接 sqlite3 库(
-lsqlite3),否则会报 "未定义引用" 错误; - 核心数据类型 :
sqlite3 *是数据库句柄(嵌入式中建议设为静态 / 全局,避免频繁打开 / 关闭); - 错误处理 :所有 sqlite3 函数返回值都是 int 型,
SQLITE_OK(0)表示成功,其他值为错误码; - 错误信息 :
sqlite3_errmsg(db)返回错误描述字符串,是调试定位问题的核心手段。
核心函数详解
| 函数名 | 原型 | 核心作用 | 注意事项 |
|---|---|---|---|
| sqlite3_open | int sqlite3_open(const char *filename, sqlite3 **ppDb); |
打开 / 创建数据库 | 路径需是可写路径(如/mnt/embedded_db.db),ppDb是输出参数 |
| sqlite3_close | int sqlite3_close(sqlite3 *db); |
关闭数据库 | 必须调用,否则内存泄漏;关闭前需确保无未完成的 SQL 操作 |
| sqlite3_exec | int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *arg, char **errmsg); |
执行 SQL 语句 | 通用接口,创建表 / 插入 / 更新 / 删除时无需回调函数,callback传 NULL |
| sqlite3_errmsg | const char *sqlite3_errmsg(sqlite3 *db); |
获取错误信息 | 错误时打印,调试必备 |
完整 C 代码示例
创建文件sqlite3_c_demo1.c:
c
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
int main(int argc, char *argv[])
{
sqlite3 *db = NULL; // 数据库句柄(嵌入式中建议设为静态/全局)
char *err_msg = NULL; // 错误信息缓冲区(需手动释放)
int ret = SQLITE_OK; // SQLite函数返回值
// 1. 打开/创建数据库(路径和命令行的embedded_db.db一致)
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. 定义创建表的SQL语句(和命令行的表结构完全一致)
const char *create_table_sql = "CREATE TABLE IF NOT EXISTS device_params ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"param_name TEXT NOT NULL, "
"param_value REAL NOT NULL, "
"update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";
// 3. 执行创建表的SQL语句(callback=NULL,arg=NULL)
ret = sqlite3_exec(db, create_table_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");
// 4. 关闭数据库
ret = sqlite3_close(db);
if (ret != SQLITE_OK)
{
fprintf(stderr, "[ERROR] 关闭数据库失败: %s\n", sqlite3_errmsg(db));
return -1;
}
printf("[INFO] 数据库关闭成功\n");
return 0;
}
操作步骤
- 编译代码(必须链接 sqlite3 库)
bash
gcc sqlite3_c_demo1.c -o sqlite3_c_demo1 -lsqlite3
- 运行程序
bash
./sqlite3_c_demo1
输出如下:
bash
[INFO] 数据库打开/创建成功
[INFO] 表创建成功(已存在则忽略)
[INFO] 数据库关闭成功
- 验证表是否创建成功(用命令行交叉验证):
bash
sqlite3 embedded_db.db ".tables"
输出如下:
bash
device_params