本系列文章主要是使用C++語言來調用其API,達到管中窺豹的目的。另外本文使用的開發環境爲mac + clion,而且基於SQLite 3.7.14來進行開發.ios
1、去下載sqlite-amalgamation-3071400.zip,而後解壓到文件夾(其結構目錄樹以下):sql
.shell
├── shell.c數據庫
├── sqlite3.c函數
├── sqlite3.h性能
└── sqlite3ext.hfetch
2、新建一個sql_tutorial的工程,景sqlite3.c和sqlite3.h文件拷貝到sql_src目錄下:spa
.code
├── main.cppsqlite
└── sql_src
├── sqlite3.c
└── sqlite3.h
3、在main.cpp中調用sqlite的代碼以下:
/** * We get the version of the SQLite database. This time we will use an SQL query. */ #include <iostream> #include "./sql_src/sqlite3.h" using namespace std; int main() { sqlite3 *db; sqlite3_stmt *res; const char *file = "test.db"; int rc = sqlite3_open(file, &db); if (rc != SQLITE_OK) { cout << "Cannot open database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); } rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); } rc = sqlite3_step(res); if (rc == SQLITE_ROW) { cout << sqlite3_column_text(res, 0) << endl; } sqlite3_finalize(res); sqlite3_close(db); return 0; }
4、最後的運行結果以下:
3.7.14 Process finished with exit code 0
調用分析:
sqlite3 *db;
一、該sqlite3的結構定義了一個數據庫句柄。每一個打開的SQLite數據庫是由數據庫句柄表示。
sqlite3_stmt *res;
二、該sqlite3_stmt結構表明一個SQL語句。
int rc = sqlite3_open(file, &db);
三、該sqlite3_open()函數打開一個新的數據庫鏈接。其參數是數據庫名稱和數據庫句柄。在「test.db的」是採用了特殊的數據庫名稱致使打開一個內存數據庫。函數的返回碼指示數據庫是否被成功打開。當鏈接成功創建,則返回SQLITE_OK。
if (rc != SQLITE_OK) { cout << "Cannot open database: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); }
四、若是返回代碼指示錯誤,咱們打印郵件到控制檯,關閉數據庫處理,並終止該計劃。該sqlite3_errmsg()函數返回錯誤的描述。它是否被打開時發生錯誤,與數據庫鏈接句柄相關聯的資源,應經過使其向sqlite3_close()函數釋放。
rc = sqlite3_prepare_v2(db, "SELECT SQLITE_VERSION()", -1, &res, 0); if (rc != SQLITE_OK) { cout << "Failed to fetch data: " << sqlite3_errmsg(db) << endl; sqlite3_close(db); exit(1); }
五、執行SQL語句以前,必須調用首先被編譯成字節代碼的sqlite3_prepare功能之一。 (該sqlite3_prepare()函數被棄用。)
sqlite3_prepare_v2()函數有五個參數。
第一個參數是從所述sqlite3_open()函數得到的數據庫句柄。
第二個參數是要編譯的SQL語句。
第三個參數爲以字節爲單位的SQL語句的最大長度。傳遞-1會致使讀取SQL字符串到第一個零終止子字符串結束了。根據該文件,能夠經過傳遞提供的SQL字符串的字節的確切數量得到一些小的性能優點。
第四個參數是語句句柄。這將指向預編譯的語句,若是sqlite3_prepare_v2()成功運行
最後一個參數是一個指向SQL語句的未使用的部分。只有SQL字符串的第一個語句被編譯,因此參數指向剩下什麼未編譯。咱們傳入0,由於該參數對咱們不是很重要。
若是成功,sqlite3_prepare_v2()返回SQLITE_OK;不然錯誤代碼返回
rc = sqlite3_step(res);
六、調用sqlite3_step()運行SQL語句。 SQLITE_ROW返回碼錶示有另外一行準備。咱們的SQL語句返回只有一行數據,所以,咱們調用這個函數一次。
sqlite3_finalize(res);
七、該sqlite3_finalize()函數銷燬準備語句對象。
sqlite3_close(db);
八、該sqlite3_close()函數關閉數據庫鏈接。