前序:... 1
一、 版本... 1
二、 基本編譯... 2
三、 SQLITE操作入門... 2
(1) 基本流程... 2
(2) SQL語句操作... 4
(3) 操作二進(jìn)制... 8
(4) 事務(wù)處理... 10
四、 給數(shù)據(jù)庫加密... 10
五、 后記... 25
前序:
Sqlite3 的確很好用。小巧、速度快。但是因?yàn)榉俏④浀漠a(chǎn)品,幫助文檔總覺得不夠。這些天再次研究它,又有一些收獲,這里把我對 sqlite3 的研究列出來,以備忘記。
這里要注明,我是一個(gè)跨平臺專注者,并不喜歡只用 windows 平臺。我以前的工作就是為 unix 平臺寫代碼。下面我所寫的東西,雖然沒有驗(yàn)證,但是我已盡量不使用任何 windows 的東西,只使用標(biāo)準(zhǔn) C 或標(biāo)準(zhǔn)C++。但是,我沒有嘗試過在別的系統(tǒng)、別的編譯器下編譯,因此下面的敘述如果不正確,則留待以后修改。
下面我的代碼仍然用 VC 編寫,因?yàn)槲矣X得VC是一個(gè)很不錯(cuò)的IDE,可以加快代碼編寫速度(例如配合 Vassist )。下面我所說的編譯環(huán)境,是VC2003。如果讀者覺得自己習(xí)慣于 unix 下用 vi 編寫代碼速度較快,可以不用管我的說明,只需要符合自己習(xí)慣即可,因?yàn)槲矣玫氖菢?biāo)準(zhǔn) C 或 C++ 。不會給任何人帶來不便。
一、 版本
從 www.sqlite.org 網(wǎng)站可下載到最新的 sqlite 代碼和編譯版本。我寫此文章時(shí),最新代碼是 3.3.17 版本。
很久沒有去下載 sqlite 新代碼,因此也不知道 sqlite 變化這么大。以前很多文件,現(xiàn)在全部合并成一個(gè) sqlite3.c 文件。如果單獨(dú)用此文件,是挺好的,省去拷貝一堆文件還擔(dān)心有沒有遺漏。但是也帶來一個(gè)問題:此文件太大,快接近7萬行代碼,VC開它整個(gè)機(jī)器都慢下來了。如果不需要改它代碼,也就不需要打開 sqlite3.c 文件,機(jī)器不會慢。但是,下面我要寫通過修改 sqlite 代碼完成加密功能,那時(shí)候就比較痛苦了。如果個(gè)人水平較高,建議用些簡單的編輯器來編輯,例如 UltraEdit 或 Notepad 。速度會快很多。
二、 基本編譯
這個(gè)不想多說了,在 VC 里新建 dos 控制臺空白工程,把 sqlite3.c 和 sqlite3.h 添加到工程,再新建一個(gè) main.cpp 文件。在里面寫:
extern "C"
{
#include "./sqlite3.h"
};
int main( int , char** )
{
return 0;
}
為什么要 extern “C” ?如果問這個(gè)問題,我不想說太多,這是C++的基礎(chǔ)。要在 C++ 里使用一段 C 的代碼,必須要用 extern “C” 括起來。C++跟 C雖然語法上有重疊,但是它們是兩個(gè)不同的東西,內(nèi)存里的布局是完全不同的,在C++編譯器里不用extern “C”括起C代碼,會導(dǎo)致編譯器不知道該如何為 C 代碼描述內(nèi)存布局。
可能在 sqlite3.c 里人家已經(jīng)把整段代碼都 extern “C” 括起來了,但是你遇到一個(gè) .c 文件就自覺的再括一次,也沒什么不好。
基本工程就這樣建立起來了。編譯,可以通過。但是有一堆的 warning。可以不管它。
三、 SQLITE操作入門
sqlite提供的是一些C函數(shù)接口,你可以用這些函數(shù)操作數(shù)據(jù)庫。通過使用這些接口,傳遞一些標(biāo)準(zhǔn) sql 語句(以 char * 類型)給 sqlite 函數(shù),sqlite 就會為你操作數(shù)據(jù)庫。
sqlite 跟MS的access一樣是文件型數(shù)據(jù)庫,就是說,一個(gè)數(shù)據(jù)庫就是一個(gè)文件,此數(shù)據(jù)庫里可以建立很多的表,可以建立索引、觸發(fā)器等等,但是,它實(shí)際上得到的就是一個(gè)文件。備份這個(gè)文件就備份了整個(gè)數(shù)據(jù)庫。
sqlite 不需要任何數(shù)據(jù)庫引擎,這意味著如果你需要 sqlite 來保存一些用戶數(shù)據(jù),甚至都不需要安裝數(shù)據(jù)庫(如果你做個(gè)小軟件還要求人家必須裝了sqlserver 才能運(yùn)行,那也太黑心了)。
下面開始介紹數(shù)據(jù)庫基本操作。
(1) 基本流程
i.1 關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
sqlite 里最常用到的是 sqlite3 * 類型。從數(shù)據(jù)庫打開開始,sqlite就要為這個(gè)類型準(zhǔn)備好內(nèi)存,直到數(shù)據(jù)庫關(guān)閉,整個(gè)過程都需要用到這個(gè)類型。當(dāng)數(shù)據(jù)庫打開時(shí)開始,這個(gè)類型的變量就代表了你要操作的數(shù)據(jù)庫。下面再詳細(xì)介紹。
i.2 打開數(shù)據(jù)庫
int sqlite3_open( 文件名, sqlite3 ** );
用這個(gè)函數(shù)開始數(shù)據(jù)庫操作。
需要傳入兩個(gè)參數(shù),一是數(shù)據(jù)庫文件名,比如:c://DongChunGuang_Database.db。
文件名不需要一定存在,如果此文件不存在,sqlite 會自動(dòng)建立它。如果它存在,就嘗試把它當(dāng)數(shù)據(jù)庫文件來打開。
sqlite3 ** 參數(shù)即前面提到的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。這個(gè)結(jié)構(gòu)底層細(xì)節(jié)如何,你不要關(guān)它。
函數(shù)返回值表示操作是否正確,如果是 SQLITE_OK 則表示操作正常。相關(guān)的返回值sqlite定義了一些宏。具體這些宏的含義可以參考 sqlite3.h 文件。里面有詳細(xì)定義(順便說一下,sqlite3 的代碼注釋率自稱是非常高的,實(shí)際上也的確很高。只要你會看英文,sqlite 可以讓你學(xué)到不少東西)。
下面介紹關(guān)閉數(shù)據(jù)庫后,再給一段參考代碼。
i.3 關(guān)閉數(shù)據(jù)庫
int sqlite3_close(sqlite3 *);
前面如果用 sqlite3_open 開啟了一個(gè)數(shù)據(jù)庫,結(jié)尾時(shí)不要忘了用這個(gè)函數(shù)關(guān)閉數(shù)據(jù)庫。
下面給段簡單的代碼:
extern "C"
{
#include "./sqlite3.h"
};
int main( int , char** )
{
sqlite3 * db = NULL; //聲明sqlite關(guān)鍵結(jié)構(gòu)指針
int result;
//打開數(shù)據(jù)庫
//需要傳入 db 這個(gè)指針的指針,因?yàn)?sqlite3_open 函數(shù)要為這個(gè)指針分配內(nèi)存,還要讓db指針指向這個(gè)內(nèi)存區(qū)
result = sqlite3_open( “c://Dcg_database.db”, &db );
if( result != SQLITE_OK )
{
//數(shù)據(jù)庫打開失敗
return -1;
}
//數(shù)據(jù)庫操作代碼
//…
//數(shù)據(jù)庫打開成功
//關(guān)閉數(shù)據(jù)庫
sqlite3_close( db );
return 0;
}
這就是一次數(shù)據(jù)庫操作過程。
新聞熱點(diǎn)
疑難解答
圖片精選