嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用_第1頁
嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用_第2頁
嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用_第3頁
嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用_第4頁
嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

千里之行,始于足下讓知識帶有溫度。第第2頁/共2頁精品文檔推薦嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用嵌入式數(shù)據(jù)庫SQLite的原理與應(yīng)用

唐敏,宋杰

(安徽高校計算機學(xué)院,安徽合肥230039)

2.4代碼開源

開源的代碼在產(chǎn)品的開發(fā)過程中不僅可以削減開發(fā)成本,更重要的是為后期的維護完美和穩(wěn)定運行都提供了最為徹底的解決辦法。

3SQLite的技術(shù)特性

SQLite是一個輕量級的關(guān)系數(shù)據(jù)庫,具有三級模式的結(jié)構(gòu)體系,即用戶模式、規(guī)律模式和存儲模式。相對于傳統(tǒng)數(shù)據(jù)庫,SQLite具有更好的的實時性、系統(tǒng)開銷小、底層控制能力強。SQLite能夠高效地利用嵌入式系統(tǒng)的有限資源,提高數(shù)據(jù)的存取速度,增加系統(tǒng)的平安性,并具有如下特點:

(1)零配置。SQLite在使用前不需要安裝設(shè)置,不需要進程來啟動、停止或配置,不需要管理員去創(chuàng)建新數(shù)據(jù)庫或分配用戶權(quán)限,在系統(tǒng)崩潰或失電之后自動恢復(fù)。

(2)對標(biāo)準(zhǔn)SQL的支持。SQLite雖然容易,但其內(nèi)嵌的SQL在很大程度上實現(xiàn)了ANSISQL92標(biāo)準(zhǔn)。特殊是SQLite支持視圖,觸發(fā)器,支持嵌套SQL;SQLite還具有事務(wù)處理功能,自動維護事務(wù)的完整性、原子性等特性,支持實體完整性和參照完整性,充分滿足了嵌入式應(yīng)用開發(fā)的需求。

(3)無服務(wù)器。大多數(shù)SQL數(shù)據(jù)庫引擎是作為一個單獨的服務(wù)器進程被執(zhí)行。拜訪數(shù)據(jù)庫的程序使用某種內(nèi)部進程通信(典型的是TCP/IP)與服務(wù)器通信,完成發(fā)送哀求到服務(wù)器和接收查詢結(jié)果的工作。SQLite不采納這種工作方式。使用SQLite時,拜訪數(shù)據(jù)庫的程序直接從磁盤上的數(shù)據(jù)庫文件讀寫。沒有中間的服務(wù)器進程。

(4)精簡性。當(dāng)尺寸優(yōu)化后,在不削減功能的狀況下,囫圇SQLite庫小于225KB。假如在編譯時去掉一些不需要的特性,庫的大小能被減小到170KB。IBM發(fā)行的CloudScape數(shù)據(jù)庫引擎是2MB的罐文件,壓縮后仍比SQLite大10倍;Firefox宣稱其客戶訂制的庫惟獨350KB,但是不包括數(shù)據(jù)庫引擎;來自Sleepycat的BerkeleyDB庫是450KB,并且刪去了SQL支持。通過比較可知:SQLite是十分小的。

(5)容易的拜訪。一個SQLite數(shù)據(jù)庫是一個單獨的一般磁盤文件,能夠被定位在路徑層次的任何地方。假如SQLite能讀寫磁盤文件,則它也能拜訪數(shù)據(jù)庫。大多數(shù)SQL數(shù)據(jù)庫引擎趨向于把數(shù)據(jù)存為一個大的文件集合,通常這些文件在一個標(biāo)準(zhǔn)的定位中,惟獨數(shù)據(jù)庫引擎本身能拜訪它。

(6)可變長度的記錄。普通的SQL數(shù)據(jù)庫引擎在表中為每一個記錄分配一個固定的磁盤空間數(shù),SQLite只使用一個記錄中實際存儲信息的磁盤空間數(shù)。明顯,這會使數(shù)據(jù)庫十分小,同時,因為在磁盤上移動的信息很少,也使數(shù)據(jù)庫很快。

(7)數(shù)據(jù)類型

SQLite最大的特點在于其數(shù)據(jù)類型為很多據(jù)類型(typelessness)。這意味著可以保存任何類型的數(shù)據(jù)到所想要保存的任何表的任何列中,無論這列聲明的數(shù)據(jù)類型是什么。雖然在生成表結(jié)構(gòu)的時候,要聲明每個域的數(shù)據(jù)類型,但SQLite并不做任何檢查。開發(fā)人員要靠自己的程序來控制輸入與讀出數(shù)據(jù)的類型。這里有一個例外,就是當(dāng)主鍵為整型值時,假如要插入一個非整型值時會產(chǎn)生異樣。

(8)使用虛擬機在SQLite中使用虛擬機對于庫的進展有很大的益處。虛擬機在前端與后端之間預(yù)備了一個好的銜接。虛擬機對于它所編譯的每一個聲明使開發(fā)者看起來清晰且容易易讀的,這在調(diào)試時有協(xié)助。依靠于它的編譯,SQLite也有跟蹤虛擬機執(zhí)行打印執(zhí)行指令和它執(zhí)行結(jié)果的能力。

(9)牢靠性較好。SQLite有良好解釋的源代碼,并且有著98%以上的測試籠罩率,有一支專業(yè)技術(shù)隊伍對系統(tǒng)舉行測試與維護工作。并且配備自立的命令行程序便利管理數(shù)據(jù)庫。

4SQLite的體系結(jié)構(gòu)

SQLite數(shù)據(jù)庫是D.RichardHipp用C語言編寫的開源嵌入式數(shù)據(jù)庫,支持的數(shù)據(jù)庫大小為2TB,所有源代碼約3萬行。SQLite采納模塊化的設(shè)計,主要由4個部分組成:內(nèi)核(Core)、SQL編譯器(SQLCompiler)、后端(Backend)以及附件(Accessories)。內(nèi)部結(jié)構(gòu)如圖1所示。

SQLite的接口是一些已經(jīng)編寫好的C庫,即使使用不同語言的API,在底層仍然使用C庫執(zhí)行。SQL語句通過接口進入到高效的SQL編譯器,由標(biāo)記處理器(tokenizer)分解成檸檬分析器(parser)可以識別的各個標(biāo)志符,然后由分析器重新組合標(biāo)志符并調(diào)用代碼生成器(codegenerator)生成虛擬機器碼,交由虛擬機(virtualmachine)去執(zhí)行,終于完成SQL語句指定的任務(wù)。虛擬機是SQLite內(nèi)部結(jié)構(gòu)的核心,不僅完成與數(shù)據(jù)操作相關(guān)的所有操作,而且還是客戶和存儲之間信息舉行交換的中間單元。數(shù)據(jù)庫根據(jù)B樹(B-tree)的形式存儲在磁盤上,通過可調(diào)節(jié)的頁面緩沖(pager)獲得對數(shù)據(jù)的迅速查找和存儲。為了便利移植,SQLite使用一個抽象層接口(OSinterface)與不同操作系統(tǒng)舉行對接。

5SQLite的開發(fā)技術(shù)

5.1命令行程序的使用

在http://www.SQLite.org/download.html頁中有PrecompiledBinariesForWindows(在此我們以Windows操作系統(tǒng)為例)這個標(biāo)題下面有sqlite-3_x_y.zip(x,y表示小版本號)后面的解釋為Acommand-lineprogramforaccessingandmodifingsqlitedatabases。下載并解壓sqlite-3_x_y.zip文件,解壓后的文件是一個sqlite3.exe文件,將該可執(zhí)行文件放到安裝操作系統(tǒng)的名目下既可。運行cmd命

令進入命令行窗口,輸入sqlite3回車,你會看到第一行:sqliteversion3.x.y;其次行:Enter“.help”forinstructions;第三行:sqlite>(SQLite的命令提醒符)。在命令提醒符下輸入.help回車可以查看到提供的命令及解釋?,F(xiàn)在我們以前學(xué)習(xí)的SQL的一些常用命令就可以用了。

圖1SQLite3的內(nèi)部結(jié)構(gòu)

5.2常用函數(shù)簡介

最新版本的SQLite提供的C語言接口的函數(shù)已有一百五十個但核心函數(shù)是下面介紹的幾個,利用這幾個函數(shù)就可以實現(xiàn)有效的數(shù)據(jù)存儲和管理。

(1)sqlite3_open()

打開數(shù)據(jù)庫函數(shù)原型:

intsqlite3_open(

constchar*filename,/*Databasefilename(UTF-8)*/

sqlite3**ppDb/*OUT:sqlitedbhandle*/

);

intsqlite3_open16(

constvoid*filename,/*Databasefilename(UTF-16)*/

sqlite3**ppDb/*OUT:sqlitedbhandle*/

);

intsqlite3_open_v2(

constchar*filename,/*Databasefilename(UTF-8)*/

sqlite3**ppDb,/*OUT:sqlitedbhandle*/

intflags,/*Flags*/

constchar*zVfs/*NameofVFSmoduletouse*/

);

第一個函數(shù)是打開UTF-8格式編碼的數(shù)據(jù)庫;其次個函數(shù)是打開UTF-16格式編碼的數(shù)據(jù)庫;第三個函數(shù)在沒有接收額外參數(shù)說明的狀況下與第一個用法相同,這兩個額外的參數(shù)可以是下列的其中之一:SQLITEOPENREADONLY,SQLITEOPENREAD-WRITE,SQLITEOPENREADWRITE/SQLITEOPENCREATE。

sqlite3_open()打開指定的數(shù)據(jù)庫,數(shù)據(jù)庫文件的路徑和名稱由flilename參數(shù)確定。假如文件不存在,就創(chuàng)建這個文件。文件打開或創(chuàng)建勝利,函數(shù)返回SQLITE_OK,同時通過ppDb參數(shù)返回合法的數(shù)據(jù)庫句柄,否則函數(shù)返回相應(yīng)的異樣代碼。

(2)sqlite3_close()

關(guān)閉數(shù)據(jù)庫函數(shù)原型:intsqlite3_close(sqlite3*db);

sqlite3_close()關(guān)閉已經(jīng)打開的數(shù)據(jù)庫。db參數(shù)傳遞的是被關(guān)閉數(shù)據(jù)庫的句柄。sqlite3_close()和sqlite3_open()是成對使用的,值得注重的是,當(dāng)sqlite3_open()打開數(shù)據(jù)庫失敗,ppDb指針參數(shù)返回一個無效的數(shù)據(jù)庫句柄時,仍然需要調(diào)用sqlite3_close(),有效地釋放指針參數(shù)占用的資源。關(guān)閉已打開的數(shù)據(jù)庫,勝利返回SQLITE?_OK,失敗返回SQLITE_ERROR,假如數(shù)據(jù)庫還沒有完成操作,將返回SQLITE_BUSY。

(3)sqlite3_exec()

執(zhí)行數(shù)據(jù)庫函數(shù)原型:

intsqlite3_exec(

sqlite3*,/*Anopendatabase*/

constchar*sql,/*SQLtobeevaluted*/

int(*callback)(void*,int,char**,char**),/*Callbackfunction*/

void*,/*1stargumenttocallback*/

char**errmsg/*Errormsgwrittenhere*/

);

這就是執(zhí)行一條sql語句的函數(shù)。第一個參數(shù)不再說了,是前面open函數(shù)得到的指針,是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。其次個參數(shù)constchar*sql是一條sql語句,以\0結(jié)尾。第三個參數(shù)是回調(diào),當(dāng)這條語句執(zhí)行之后,SQLite3會去調(diào)用你提供的這個函數(shù)。第四個參數(shù)void*是你所提供的指針,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)終于會傳到回調(diào)函數(shù)里面,假如不需要傳遞指針給回調(diào)函數(shù),可以填NULL。第五個參數(shù)char**errmsg是錯誤信息。注重是指針的指針。SQLite3里面有無數(shù)固定的錯誤信息。執(zhí)行sqlite3_exec之后,執(zhí)行失敗時可以查閱這個指針(直接printf(“%s\n”,errmsg))得到一串字符串信息,這串信息告知你錯在什么地方。sqlite3_exec函數(shù)通過修改你傳入的指針的指針,把你提供的指針指向錯誤提醒信息,這樣sqlite3_exec函數(shù)外面就可以通過這個char*得到詳細錯誤提醒。

說明:通常,sqlite3_callback和它后面的void*這兩個位置都可以填NULL。填NULL表示你不需要回調(diào)。比如你做insert操作,做delete操作,就沒有須要使用回調(diào)。而當(dāng)你做select時,就要使用回調(diào),由于SQLite3把數(shù)據(jù)查出來,得通過回調(diào)告知你查出了什么數(shù)據(jù)。

(4)出錯處理函數(shù)

intsqlite3_errcode(sqlite3*db);

constchar*sqlite3_errmsg(sqlite3*);

constvoid*sqlite3_errmsg16(sqlite3*);

出錯處理函數(shù)有上面的三個函數(shù)。第一個函數(shù)返回錯誤代碼;其次個函數(shù)獵取最近一次操作錯誤信息,對應(yīng)的是UTF-8編碼格式;第三個函數(shù)獵取最近一次操作錯誤信息,對應(yīng)的是UTF-16編碼格式。

6SQLite在arm-linux平臺上的實現(xiàn)

SQLite嵌入式數(shù)據(jù)庫提供了以源碼發(fā)布的方式,要在眾多的硬件平臺舉行移植,可以按照不同平臺對源碼舉行交錯編譯來實現(xiàn)。編譯主要有以下幾個步驟:

(1)用“echoPATH”命令查看PATH中是否已經(jīng)包含交錯編譯工具arm-linux-gcc。

(2)到http://www.sqlite.org/下載最新的源代碼包(本文使用的是3.5.4版)sqlite-3.5.4.tar.gz使用tar命令舉行解壓,解壓完成后,進入sqlite-3.5.4名目下可以看到源代碼和它的一些補充文件。

(3)為了在ARM9-linux下能正常運行SQLite,需要對相關(guān)的文件作一些修改。將根名目下的Makefile.Linux-gcc拷貝并重命名為Makefile并使用vim對文件舉行相應(yīng)的修改:找到TOP=../sqlite修改為:TOP=.;TCC=gcc-O6修改為:TCC=arm-linux-gcc-O6;AR=arcr修改為:AR=arm-linux-arcr;RANLIB=ranlib修改為:RANLIB=arm-linux-ranlib;MKSHLIB=gcc-shared修改為:MKSHLIB=arm-linux-gcc-shared。解釋掉下面的行#TCL_FLAGS=-I/home/drh/tcltk/8.4linux

#LIBTCL=/home/drh/tcltk/8.4linux/libtcl8.4g.a-lm-ldl

TLIBS=將其修改為:TLIBS=-ldl

(4)修改main.mk文件,把select.otable.o(TCLOBJ)tokenize.otrigge

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論