首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

SQLite 核心概念與 C/C++ API 完整指南:輕量級嵌入式資料庫入門

     編輯:MySQL 綜合教學

什麼是 SQLite?

SQLite 是一款極輕量的嵌入式關聯式資料庫引擎。它不需要獨立的伺服器進程,直接讀寫磁碟檔案,整個資料庫(定義、表、索引、資料)僅包含在單一檔案中。核心特點包括:

  • 零配置: 無需安裝、配置伺服器,嵌入應用程式即可使用
  • 資源極低: 嵌入式裝置僅需幾百 KB 記憶體即可運行
  • 跨平台: 檔案格式通用,可在 32/64 位系統、大/小端序架構間自由複製
  • 效能優異: 針對嵌入式場景優化,讀寫速度常超越 MySQL、PostgreSQL 等客戶端-伺服器架構資料庫
  • ACID 完整支援: 即使發生系統崩潰或斷電,事務仍保證原子性

資料庫基礎知識回顧

資料庫分類

類別典型產品適用場景
關聯式 (RDBMS)Oracle, MySQL, SQL Server, PostgreSQL, SQLite, Access結構化資料、複雜查詢、事務處理
非關聯式MongoDB, Redis, Memcached, Cassandra高並發、海量非結構化資料、快取

資料儲存結構

關聯式資料庫以 表 為基本單位,類似 Excel 工作表:

  1. 建立表
  2. 定義欄位
  3. 插入記錄(每行對應一組欄位值)

移動端/iOS 常見資料持久化方案對比

方案優點缺點適用場景
Plist / NSUserDefaults簡單、系統原生支援不適合大量/結構化資料、查詢效能差設定檔、少量鍵值對
NSCoding 歸檔物件直接序列化版本遷移困難、無法高效查詢簡單模型物件持久化
SQLite3標準 SQL、高效查詢、關聯支援、跨平台需編寫 SQL、手動管理連線/事務結構化資料、複雜查詢、大量資料
Core Data物件圖管理、自動遷移、Undo/Redo學習曲線陡峭、非關聯式、效能調優複雜複雜物件圖、需自動遷移的專案

SQLite3 C API 核心流程詳解

SQLite 的 C 介面採用 編譯-綁定-逐步執行 模式,核心步驟如下:

1. 開啟資料庫連線

int sqlite3_open(
    const char *filename,   // 資料庫檔案路徑,":memory:" 表記憶體資料庫
    sqlite3 **ppDb          // 輸出:資料庫連線控制代碼
);
  • 成功返回 SQLITE_OK (0)
  • 失敗返回錯誤碼,*ppDb 為 NULL

2. 執行單條/多條 SQL(無結果集)

int sqlite3_exec(
    sqlite3 *db,                    // 開啟的資料庫連線
    const char *sql,                // 要執行的 SQL 語句(可含多條,以 ; 分隔)
    int (*callback)(void*,int,char**,char**), // 選填:結果集回呼函數
    void *arg,                      // 傳給回呼的第一個參數
    char **errmsg                   // 輸出:錯誤訊息(需 sqlite3_free 釋放)
);

適用於 CREATE、INSERT、UPDATE、DELETE 等無結果集操作。

3. 準備預處理語句(核心高效查詢方式)

int sqlite3_prepare_v2(
    sqlite3 *db,              // 資料庫連線
    const char *zSql,         // SQL 語句(含 ? 佔位符)
    int nByte,                // SQL 最大位元組長度,-1 表自動計算
    sqlite3_stmt **ppStmt,    // 輸出:預處理語句控制代碼
    const char **pzTail       // 輸出:未處理的 SQL 尾部
);

優勢: 防 SQL 注入、重複執行效能高、參數綁定類型安全。

4. 逐行獲取查詢結果

int sqlite3_step(sqlite3_stmt *stmt);
  • 返回 SQLITE_ROW:成功取得一行資料
  • 返回 SQLITE_DONE:無更多資料
  • 其他值:錯誤

5. 從當前行讀取欄位值(索引從 0 開始)

資料類型API 函數備註
雙精度浮點數sqlite3_column_double(stmt, iCol)
32 位整數sqlite3_column_int(stmt, iCol)
64 位整數sqlite3_column_int64(stmt, iCol)
二進制/BLOBsqlite3_column_blob(stmt, iCol)配合 sqlite3_column_bytes 獲取長度
文字/UTF-8sqlite3_column_text(stmt, iCol)返回 const unsigned char*,需轉型
NULL 判斷sqlite3_column_type(stmt, iCol) == SQLITE_NULL讀取前必須檢查

6. 參數綁定(防注入關鍵)

// 綁定文字
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 表示資料生命週期由呼叫者管理。

7. 釋放資源(必要步驟)

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 倍
  • 善用索引: 針對 WHERE、JOIN、ORDER BY 欄位建立索引
  • 重用預處理語句: 避免重複 prepare,僅綁定新參數呼叫 step
  • 設定 WAL 模式: PRAGMA journal_mode=WAL; 大幅提升並發讀寫效能
  • 定期 VACUUM: 整理碎片、回收空間

總結

SQLite 以其零配置、單一檔案、完整 SQL 支援成為嵌入式/移動端首選資料庫。掌握其 C API 核心流程(open → prepare → bind → step → column → finalize → close)並遵循最佳實踐(事務、索引、WAL、參數綁定),即可構建高效、可靠的本地資料存儲方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved