一、簡介
SQLite是一個基於檔案的輕量級資料庫,但功能還挺強,速度也很快,對於小型資料庫應用開發絕對夠用了。使用起來也非常方便,下面的介紹可以看出來,使用起來真的非常簡單。
二、官方網站
Sqlite的官方網站www.sqlite.org,在該網站可以下載最新的sqlite版本。
三、協助工具輔助工具
Sqlite資料庫的管理工具有SQLiteManager、SqliteAdmin等。
SqliteManager只有英文版,但功能強大,有個問題就是不支援ANSI字元集的漢字顯示。其內建的協助文檔有SQL語句的詳細介紹,對於不熟悉Sql語句的人來說很方便。而且它的很多操作都有自動的SQL語句提示,對於不常使用資料庫的人來說也很好用。
SqliteAdmin有綠色中文版,功能相對於SqliteManager略少,對於熟悉Sql語句的人,該版本夠用了。
四、C/C++使用前準備
直接將sqlite3.h和sqlite3.c加入自己的C/C++工程中,即可使用sqlite3。
五、開啟關閉資料庫
Sqlite支援UTF-8和UTF-16,不過它居然不支援C/C++程式中最常用的ANSI。因此資料庫路徑中如果包含中文字元的話,需要將路徑轉換成相應的字元格式設定。
1、以UTF-8方式開啟
//開啟資料庫 sqlite3 *db = NULL; int result = sqlite3_open("c:\\abc.db", &db); if (SQLITE_OK != result) { return; } //關閉資料庫 sqlite3_close(db); |
2、以UTF-16方式開啟
如要以UTF-16方式開啟,把開啟資料庫的語句改為"sqlite3_open16(L"c:\\abc.db", &db)"即可。
但一般情況,強烈不建議使用UTF-16方式開啟資料庫,根據我的測試,我發現如果以這種方式開啟資料庫,在後續建立資料表的時候,如果其中有某項為TEXT類型。那麼資料表的這項資料內容,將會強制確定類型為UTF-16。也就是說,你插入的任何資料,都將被轉換為UTF-16並存入資料庫。而執行SQL的語句是UTF-8格式的,因此當你取出的資料和你存入的資料是不一致的,很顯然這對於使用者而言是一個災難。
六、執行SQL語句
執行SQL語句可以調用sqlite3_exec函數,一般來說,如果不需要返回的資料和錯誤資訊,執行方式如下:
sqlite3_exec(db, strSQL, 0, 0, 0); |
1、建立表
假設建立如所示的資料庫:
其SQL語句為:
CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL, [MyDate] DATE NOT NULL, [MyTime] TIME NULL,[MyFloat] FLOAT NULL) |
2、插入記錄
下面是插入一條記錄的樣本SQL語句。
INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好遠!', '2012-03-23', '9:00:00', 1000) |
3、更新記錄
下面是更新若干條記錄的樣本SQL語句。
UPDATE MyTable SET MyText='真的嗎?', MyTime='10:00:00' WHERE ID >=0 AND ID <=20 |
4、刪除記錄
下面是刪除若干條記錄的樣本SQL語句。
DELETE FROM MyTable WHERE ID >=3 AND ID <=5 |
5、大量操作
如果要進行大量的操作,比如要插入10000條資料,如果逐條執行SQL語句,則消耗的時間非常長。採用事務的方式批量處理,可以極大程度提升操作速度(我用1000條記錄實驗了一下,速度提高了500倍以上)。
下面是一個批量插入10000條資料的程式碼範例:
//插入條資料(在Begin和Commit之間大量操作,可以大幅度提高效率) result = sqlite3_exec(db, "BEGIN;", 0, 0, 0); for (int i=0; i<10000; i++) { //插入一條資料 result = sqlite3_exec(db, "INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('---上班好遠!', '2012-03-23', '9:00:00', 1000);", 0, 0, 0); } result = sqlite3_exec(db, "COMMIT;", 0, 0, 0); |
七、查詢並返回結果 1、以表單形式返回
下面是以表單形式擷取資料的範例程式碼:
//查詢記錄(返回資料表的方式) char **pazResult; int nRow, nCol; sqlite3_get_table(db, "SELECT * FROM MyTable LIMIT 1000 OFFSET 2000", &pazResult, &nRow, &nCol, 0); //nRow指示出有多少行 //nCol指示出有多少列 //從pazResult中可以解析出所有記錄,記錄以字串形式返回 //第n列的名稱,存放於pazResult[n] //第n行第m列的資料,存放與paszResult[(m + 1) * nCol + m] //使用完後,務必釋放為記錄分配的記憶體 sqlite3_free_table(pazResult); |
上面的查詢代碼,也示範了如何查詢指定位置指定條數的記錄,這種查詢方法在記錄集非常龐大的時候很有用。
2、以回調形式返回
下面以代碼形式樣本如何獲得查詢語句返回的記錄。
首先需要定義一個回呼函數如下(參數意義待會再說):
int Result(void* pContext, int nCol, char** azValue, char** azName); |
然後調用sqlite函數執行查詢語句,在回呼函數一欄輸入上面定義的回呼函數:
sqlite3_exec(db, "SELECT * FROM MyTable LIMIT 10 OFFSET 20", Result, 0, 0); |
執行該SQL語句時,每返回一條記錄都會觸發一次上面的回呼函數,在該回呼函數的實現中,即可得到查詢結果。
在上面的Result函數中,各個參數意義如下:
pContext |
這個參數是調用sqlite3_exec函數是輸入的第4個參數。它通常作為環境變數用於指示出當前執行代碼的主體。範例程式碼中我忽略了這個參數,但正式使用時一般不會忽略它。 |
nCol |
表示該條記錄有多少列。 |
azValue |
返回的資料都蘊含在該變數中,它也是一個字串數組。azValue[n]即為第n列的資料。 |
azName |
存放列的名稱,azName[n]就是第n列的名稱。 |
八、存取位元據
存取位元據需要用到sqlite3_bind_blob等函數,具體用法可以查看這些函數的聲明。作為一個輕量級資料庫,我一般不用它儲存位元據,因此這兒不再詳細描述這些內容。