天天看點

sqlite3 研究一

背景

由于項目中使用sqlite,而且使用的比較頻繁,雖然有别人的項目中的例子作為參考,但是,自己不熟悉畢竟心理沒有底,趁這個機會,好好學習一下。雖然這個資料庫是很小的,但是要想用好它,也必須好好研究一番,網上的例子都是些小兒科。在此,以官網的doc為例,增删改查挨個測試一遍,以經典的學生資訊為例吧

API

建立資料庫

打開一個資料庫,沒有的話,就建立。使用的API為:

int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);
           

打開成功後傳回一個句柄,傳回值為:SQLITE_OK。失敗的情況隻有一種情況,就是沒有申請到足夠的記憶體。

例如:

int ret = -1;
sqlite3 *db = NULL;

ret = sqlite3_open("my.db", &db);
if (ret != SQLITE_OK) {
    printf("open database failed.\n");
    return -1;
}
           

待确認的幾點:

  • 打開失敗後,需不需要關閉?
  • 打開屬性是什麼樣的,隻讀、隻寫、可讀可寫等。由于沒有該flag作為參數,那麼預設是什麼呢?

成功打開資料庫之後,不使用或後續的指令出錯等,需要關閉資料庫的。

關閉還是比較簡單,傳入的唯一參數就是打開時傳回的那個資料庫的句柄。需要注意的是,關閉時,如果還有沒有完成的事務,會傳回SQLITE_BUSY。正常傳回SQLITE_OK。

待确認:

  • 該函數的傳回值需不需要檢測?如何檢測?

執行SQL

我們使用的SQL文本是不能直接被sqlite識别并使用的,需要轉變成對應的聲明對象方可。官網文檔的比喻,可以把聲明對象想象為一個程式,SQL文本類似于源碼,需要通過把SQL文本編譯成聲明對象,sqlite才能識别并運作它。

聲明對象的原型:

而負責轉換的函數為:

int sqlite3_prepare_v2(
  sqlite3 *db,            /* Database handle */
  const char *zSql,       /* SQL statement, UTF-8 encoded */
  int nByte,              /* Maximum length of zSql in bytes. */
  sqlite3_stmt **ppStmt,  /* OUT: Statement handle */
  const char **pzTail     /* OUT: Pointer to unused portion of zSql */
);
           

類似函數還有幾個,官方更推薦使用這個。該函數的功能就是把SQL文本(zSql)轉換成聲明對象(ppStmt)。

但是,該SQL語句還是沒有被執行的,執行的函數為:

調用該函數需要判斷傳回值,并對執行結果一行行的處理,直到傳回值為SQLITE_DONE為止。對應該函數還是不太了解如何用,特别是select的時候,貌似是一次隻能查詢一行。

執行完後,需要把聲明對象銷毀的,使用的函數為:

該函數和sqlite3_prepare_v2是對應起來的,如new和delete。

另外,還有一個查詢使用的函數sqlite3_get_table,官方不推薦使用了,不再贅述。

最後有個使用比較廣泛的函數:

int sqlite3_exec(
  sqlite3*,                                  /* An open database */
  const char *sql,                           /* SQL to be evaluated */
  int (*callback)(void*,int,char**,char**),  /* Callback function */
  void *,                                    /* 1st argument to callback */
  char **errmsg                              /* Error msg written here */
);
           

這個函數是sqlite3_prepare_v2(),sqlite3_step(),sqlite3_finalize()這三個函數的封裝,并且可以執行多條SQL語句。

參考

https://blog.csdn.net/xiaoaid01/article/details/17998013

https://www.sqlite.org/c3ref/column_blob.html

https://www.runoob.com/sqlite/sqlite-c-cpp.html

https://blog.csdn.net/fangye945a/article/details/86484547?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

https://blog.csdn.net/zouleideboke/article/details/73649886