嵌入式 SQLite 數據庫開發入門筆記
在嵌入式開發中,數據存儲與管理是不可或缺的環節。對于資源有限的系統,輕量級數據庫 SQLite 是一個非常理想的選擇。它無需獨立服務進程,直接嵌入到應用中即可使用,既能滿足數據持久化需求,又不會過多占用系統資源。本文將結合實踐代碼,系統梳理 SQLite 在嵌入式中的使用方法。
一、SQLite 簡介
定義
SQLite 是一個輕量級的關系型數據庫管理系統(RDBMS),以文件形式存儲數據,零配置、跨平臺、易移植。適用場景
嵌入式設備(路由器、物聯網設備、手持終端)
本地應用配置存儲
移動端(Android、iOS 應用)
數據組織結構
數據庫(Database) -> 表(Table) -> 行(Row) -> 列(Column)
二、SQLite 命令行工具常用操作
SQLite 提供了簡單的命令行工具,非常適合調試和學習。
命令 | 功能說明 |
---|---|
.help | 顯示幫助信息 |
.database | 顯示當前打開的數據庫文件 |
.tables | 列出數據庫中所有表 |
.schema 表名 | 查看表結構 |
.header on | 打開表頭顯示 |
.quit / .q | 退出 SQLite 命令行工具 |
常用 SQL 語法
-- 插入數據
INSERT INTO user VALUES (1, 'zhangsan', 25);-- 查詢數據
SELECT * FROM user;
SELECT name, age FROM user WHERE age > 20;-- 更新數據
UPDATE user SET age=26 WHERE id=1;-- 刪除數據
DELETE FROM user WHERE id=2;
三、C 語言調用 SQLite
在嵌入式開發中,我們通常通過 SQLite 提供的 C API 來操作數據庫。
1. 基本流程
sqlite3 *db = NULL;
int ret = sqlite3_open("./aaa.db", &db);
if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_open error: %s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;
}char sql_cmd[] = "INSERT INTO user VALUES(11,'lisi',20);";
char *errmsg = NULL;
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;
}sqlite3_close(db);
sqlite3_open()
:打開數據庫文件,不存在則新建。sqlite3_exec()
:執行 SQL 語句。sqlite3_close()
:關閉數據庫。
四、回調函數處理查詢結果
執行 SELECT
查詢時,sqlite3_exec()
可以傳入一個 回調函數,用來逐行處理結果。
1. 回調函數原型
int callback(void *arg, int col, char **result, char **title);
arg:用戶自定義數據指針(
sqlite3_exec
的第四個參數傳入)。col:當前行的列數。
result:字符串數組,存放每列的值。
title:字符串數組,存放每列的列名。
👉 特性:
如果有多條結果,回調函數會被多次調用。
如果結果為空,回調函數不會被調用。
2. 示例代碼
#include <sqlite3.h>
#include <stdio.h>int show(void* arg, int col, char** result, char** title)
{static int flag = 0; // 表頭只打印一次int i = 0;if (flag == 0) {flag = 1;for (i = 0; i < col; i++) {printf("%s\t", title[i]);}printf("\n");}for (i = 0; i < col; i++) {printf("%s\t", result[i] ? result[i] : "NULL");}printf("\n");return 0;
}int main()
{sqlite3* db = NULL;char* errmsg = NULL;int ret = sqlite3_open("./aaa.db", &db);if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_open %s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}char sql_cmd[] = "SELECT * FROM user;";ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}
3. 輸出示例
假設表內容如下:
CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
INSERT INTO user VALUES (1, 'zhangsan', 25);
INSERT INTO user VALUES (2, 'lisi', 30);
程序運行結果:
id name age
1 zhangsan 25
2 lisi 30
五、嵌入式 SQLite 開發心得
數據庫文件位置
嵌入式系統 Flash 容量有限,建議放在合適的分區,并避免頻繁寫入。
事務優化
默認每次寫入都會同步到磁盤,效率低。
使用事務:
BEGIN TRANSACTION; INSERT INTO user VALUES(3,'wangwu',22); INSERT INTO user VALUES(4,'zhaoliu',28); COMMIT;
可以顯著提高批量插入速度。
內存占用
SQLite 默認內存消耗較低,但在嵌入式系統中仍需注意查詢規模,避免一次性查詢過大數據集。
回調 vs 預編譯接口
sqlite3_exec()
簡單易用,適合小型查詢。更復雜場景可使用 預編譯語句 API(
sqlite3_prepare_v2
/sqlite3_step
/sqlite3_finalize
),性能更好。
六、總結
SQLite 在嵌入式系統中有以下優勢:
單文件存儲,移植方便
零配置、無需后臺進程
支持標準 SQL,功能完備
資源占用低,適合嵌入式場景
通過本文的學習,你可以在嵌入式系統中完成數據庫文件的創建、數據的增刪改查,以及通過 回調函數 高效獲取查詢結果。