SQLite 是一款極輕量的嵌入式關聯式資料庫引擎。它不需要獨立的伺服器進程,直接讀寫磁碟檔案,整個資料庫(定義、表、索引、資料)僅包含在單一檔案中。核心特點包括:
| 類別 | 典型產品 | 適用場景 |
|---|---|---|
| 關聯式 (RDBMS) | Oracle, MySQL, SQL Server, PostgreSQL, SQLite, Access | 結構化資料、複雜查詢、事務處理 |
| 非關聯式 | MongoDB, Redis, Memcached, Cassandra | 高並發、海量非結構化資料、快取 |
關聯式資料庫以 表 為基本單位,類似 Excel 工作表:
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Plist / NSUserDefaults | 簡單、系統原生支援 | 不適合大量/結構化資料、查詢效能差 | 設定檔、少量鍵值對 |
| NSCoding 歸檔 | 物件直接序列化 | 版本遷移困難、無法高效查詢 | 簡單模型物件持久化 |
| SQLite3 | 標準 SQL、高效查詢、關聯支援、跨平台 | 需編寫 SQL、手動管理連線/事務 | 結構化資料、複雜查詢、大量資料 |
| Core Data | 物件圖管理、自動遷移、Undo/Redo | 學習曲線陡峭、非關聯式、效能調優複雜 | 複雜物件圖、需自動遷移的專案 |
SQLite 的 C 介面採用 編譯-綁定-逐步執行 模式,核心步驟如下:
int sqlite3_open(
const char *filename, // 資料庫檔案路徑,":memory:" 表記憶體資料庫
sqlite3 **ppDb // 輸出:資料庫連線控制代碼
);
SQLITE_OK (0)*ppDb 為 NULLint sqlite3_exec(
sqlite3 *db, // 開啟的資料庫連線
const char *sql, // 要執行的 SQL 語句(可含多條,以 ; 分隔)
int (*callback)(void*,int,char**,char**), // 選填:結果集回呼函數
void *arg, // 傳給回呼的第一個參數
char **errmsg // 輸出:錯誤訊息(需 sqlite3_free 釋放)
);
適用於 CREATE、INSERT、UPDATE、DELETE 等無結果集操作。
int sqlite3_prepare_v2(
sqlite3 *db, // 資料庫連線
const char *zSql, // SQL 語句(含 ? 佔位符)
int nByte, // SQL 最大位元組長度,-1 表自動計算
sqlite3_stmt **ppStmt, // 輸出:預處理語句控制代碼
const char **pzTail // 輸出:未處理的 SQL 尾部
);
優勢: 防 SQL 注入、重複執行效能高、參數綁定類型安全。
int sqlite3_step(sqlite3_stmt *stmt);
SQLITE_ROW:成功取得一行資料SQLITE_DONE:無更多資料| 資料類型 | API 函數 | 備註 |
|---|---|---|
| 雙精度浮點數 | sqlite3_column_double(stmt, iCol) | |
| 32 位整數 | sqlite3_column_int(stmt, iCol) | |
| 64 位整數 | sqlite3_column_int64(stmt, iCol) | |
| 二進制/BLOB | sqlite3_column_blob(stmt, iCol) | 配合 sqlite3_column_bytes 獲取長度 |
| 文字/UTF-8 | sqlite3_column_text(stmt, iCol) | 返回 const unsigned char*,需轉型 |
| NULL 判斷 | sqlite3_column_type(stmt, iCol) == SQLITE_NULL | 讀取前必須檢查 |
// 綁定文字 sqlite3_bind_text(stmt, 1, "張三", -1, SQLITE_TRANSIENT); // 綁定整數 sqlite3_bind_int(stmt, 2, 25); // 綁定二進制 sqlite3_bind_blob(stmt, 3, data, len, SQLITE_TRANSIENT);
第 5 參數 SQLITE_TRANSIENT 表示 SQLite 複製資料,SQLITE_STATIC 表示資料生命週期由呼叫者管理。
sqlite3_finalize(stmt); // 釋放預處理語句 sqlite3_close(db); // 關閉資料庫連線
sqlite3 *db;
if (sqlite3_open("app.db", &db) == SQLITE_OK) {
sqlite3_stmt *stmt;
const char *sql = "SELECT id, name, age FROM users WHERE age > ?";
if (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 18); // 綁定參數
while (sqlite3_step(stmt) == SQLITE_ROW) {
int id = sqlite3_column_int(stmt, 0);
const char *name = (const char*)sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
printf("ID:%d Name:%s Age:%d\n", id, name, age);
}
sqlite3_finalize(stmt);
}
sqlite3_close(db);
}
BEGIN; ... COMMIT; 可提升插入效能 10-100 倍prepare,僅綁定新參數呼叫 stepPRAGMA journal_mode=WAL; 大幅提升並發讀寫效能SQLite 以其零配置、單一檔案、完整 SQL 支援成為嵌入式/移動端首選資料庫。掌握其 C API 核心流程(open → prepare → bind → step → column → finalize → close)並遵循最佳實踐(事務、索引、WAL、參數綁定),即可構建高效、可靠的本地資料存儲方案。