




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
千里之行,始于足下讓知識(shí)帶有溫度。第第2頁(yè)/共2頁(yè)精品文檔推薦嵌入式數(shù)據(jù)庫(kù)SQLite的原理與應(yīng)用嵌入式數(shù)據(jù)庫(kù)SQLite的原理與應(yīng)用
唐敏,宋杰
(安徽高校計(jì)算機(jī)學(xué)院,安徽合肥230039)
2.4代碼開源
開源的代碼在產(chǎn)品的開發(fā)過(guò)程中不僅可以削減開發(fā)成本,更重要的是為后期的維護(hù)完美和穩(wěn)定運(yùn)行都提供了最為徹底的解決辦法。
3SQLite的技術(shù)特性
SQLite是一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù),具有三級(jí)模式的結(jié)構(gòu)體系,即用戶模式、規(guī)律模式和存儲(chǔ)模式。相對(duì)于傳統(tǒng)數(shù)據(jù)庫(kù),SQLite具有更好的的實(shí)時(shí)性、系統(tǒng)開銷小、底層控制能力強(qiáng)。SQLite能夠高效地利用嵌入式系統(tǒng)的有限資源,提高數(shù)據(jù)的存取速度,增加系統(tǒng)的平安性,并具有如下特點(diǎn):
(1)零配置。SQLite在使用前不需要安裝設(shè)置,不需要進(jìn)程來(lái)啟動(dòng)、停止或配置,不需要管理員去創(chuàng)建新數(shù)據(jù)庫(kù)或分配用戶權(quán)限,在系統(tǒng)崩潰或失電之后自動(dòng)恢復(fù)。
(2)對(duì)標(biāo)準(zhǔn)SQL的支持。SQLite雖然容易,但其內(nèi)嵌的SQL在很大程度上實(shí)現(xiàn)了ANSISQL92標(biāo)準(zhǔn)。特殊是SQLite支持視圖,觸發(fā)器,支持嵌套SQL;SQLite還具有事務(wù)處理功能,自動(dòng)維護(hù)事務(wù)的完整性、原子性等特性,支持實(shí)體完整性和參照完整性,充分滿足了嵌入式應(yīng)用開發(fā)的需求。
(3)無(wú)服務(wù)器。大多數(shù)SQL數(shù)據(jù)庫(kù)引擎是作為一個(gè)單獨(dú)的服務(wù)器進(jìn)程被執(zhí)行。拜訪數(shù)據(jù)庫(kù)的程序使用某種內(nèi)部進(jìn)程通信(典型的是TCP/IP)與服務(wù)器通信,完成發(fā)送哀求到服務(wù)器和接收查詢結(jié)果的工作。SQLite不采納這種工作方式。使用SQLite時(shí),拜訪數(shù)據(jù)庫(kù)的程序直接從磁盤上的數(shù)據(jù)庫(kù)文件讀寫。沒有中間的服務(wù)器進(jìn)程。
(4)精簡(jiǎn)性。當(dāng)尺寸優(yōu)化后,在不削減功能的狀況下,囫圇SQLite庫(kù)小于225KB。假如在編譯時(shí)去掉一些不需要的特性,庫(kù)的大小能被減小到170KB。IBM發(fā)行的CloudScape數(shù)據(jù)庫(kù)引擎是2MB的罐文件,壓縮后仍比SQLite大10倍;Firefox宣稱其客戶訂制的庫(kù)惟獨(dú)350KB,但是不包括數(shù)據(jù)庫(kù)引擎;來(lái)自Sleepycat的BerkeleyDB庫(kù)是450KB,并且刪去了SQL支持。通過(guò)比較可知:SQLite是十分小的。
(5)容易的拜訪。一個(gè)SQLite數(shù)據(jù)庫(kù)是一個(gè)單獨(dú)的一般磁盤文件,能夠被定位在路徑層次的任何地方。假如SQLite能讀寫磁盤文件,則它也能拜訪數(shù)據(jù)庫(kù)。大多數(shù)SQL數(shù)據(jù)庫(kù)引擎趨向于把數(shù)據(jù)存為一個(gè)大的文件集合,通常這些文件在一個(gè)標(biāo)準(zhǔn)的定位中,惟獨(dú)數(shù)據(jù)庫(kù)引擎本身能拜訪它。
(6)可變長(zhǎng)度的記錄。普通的SQL數(shù)據(jù)庫(kù)引擎在表中為每一個(gè)記錄分配一個(gè)固定的磁盤空間數(shù),SQLite只使用一個(gè)記錄中實(shí)際存儲(chǔ)信息的磁盤空間數(shù)。明顯,這會(huì)使數(shù)據(jù)庫(kù)十分小,同時(shí),因?yàn)樵诖疟P上移動(dòng)的信息很少,也使數(shù)據(jù)庫(kù)很快。
(7)數(shù)據(jù)類型
SQLite最大的特點(diǎn)在于其數(shù)據(jù)類型為很多據(jù)類型(typelessness)。這意味著可以保存任何類型的數(shù)據(jù)到所想要保存的任何表的任何列中,無(wú)論這列聲明的數(shù)據(jù)類型是什么。雖然在生成表結(jié)構(gòu)的時(shí)候,要聲明每個(gè)域的數(shù)據(jù)類型,但SQLite并不做任何檢查。開發(fā)人員要靠自己的程序來(lái)控制輸入與讀出數(shù)據(jù)的類型。這里有一個(gè)例外,就是當(dāng)主鍵為整型值時(shí),假如要插入一個(gè)非整型值時(shí)會(huì)產(chǎn)生異樣。
(8)使用虛擬機(jī)在SQLite中使用虛擬機(jī)對(duì)于庫(kù)的進(jìn)展有很大的益處。虛擬機(jī)在前端與后端之間預(yù)備了一個(gè)好的銜接。虛擬機(jī)對(duì)于它所編譯的每一個(gè)聲明使開發(fā)者看起來(lái)清晰且容易易讀的,這在調(diào)試時(shí)有協(xié)助。依靠于它的編譯,SQLite也有跟蹤虛擬機(jī)執(zhí)行打印執(zhí)行指令和它執(zhí)行結(jié)果的能力。
(9)牢靠性較好。SQLite有良好解釋的源代碼,并且有著98%以上的測(cè)試籠罩率,有一支專業(yè)技術(shù)隊(duì)伍對(duì)系統(tǒng)舉行測(cè)試與維護(hù)工作。并且配備自立的命令行程序便利管理數(shù)據(jù)庫(kù)。
4SQLite的體系結(jié)構(gòu)
SQLite數(shù)據(jù)庫(kù)是D.RichardHipp用C語(yǔ)言編寫的開源嵌入式數(shù)據(jù)庫(kù),支持的數(shù)據(jù)庫(kù)大小為2TB,所有源代碼約3萬(wàn)行。SQLite采納模塊化的設(shè)計(jì),主要由4個(gè)部分組成:內(nèi)核(Core)、SQL編譯器(SQLCompiler)、后端(Backend)以及附件(Accessories)。內(nèi)部結(jié)構(gòu)如圖1所示。
SQLite的接口是一些已經(jīng)編寫好的C庫(kù),即使使用不同語(yǔ)言的API,在底層仍然使用C庫(kù)執(zhí)行。SQL語(yǔ)句通過(guò)接口進(jìn)入到高效的SQL編譯器,由標(biāo)記處理器(tokenizer)分解成檸檬分析器(parser)可以識(shí)別的各個(gè)標(biāo)志符,然后由分析器重新組合標(biāo)志符并調(diào)用代碼生成器(codegenerator)生成虛擬機(jī)器碼,交由虛擬機(jī)(virtualmachine)去執(zhí)行,終于完成SQL語(yǔ)句指定的任務(wù)。虛擬機(jī)是SQLite內(nèi)部結(jié)構(gòu)的核心,不僅完成與數(shù)據(jù)操作相關(guān)的所有操作,而且還是客戶和存儲(chǔ)之間信息舉行交換的中間單元。數(shù)據(jù)庫(kù)根據(jù)B樹(B-tree)的形式存儲(chǔ)在磁盤上,通過(guò)可調(diào)節(jié)的頁(yè)面緩沖(pager)獲得對(duì)數(shù)據(jù)的迅速查找和存儲(chǔ)。為了便利移植,SQLite使用一個(gè)抽象層接口(OSinterface)與不同操作系統(tǒng)舉行對(duì)接。
5SQLite的開發(fā)技術(shù)
5.1命令行程序的使用
在http://www.SQLite.org/download.html頁(yè)中有PrecompiledBinariesForWindows(在此我們以Windows操作系統(tǒng)為例)這個(gè)標(biāo)題下面有sqlite-3_x_y.zip(x,y表示小版本號(hào))后面的解釋為Acommand-lineprogramforaccessingandmodifingsqlitedatabases。下載并解壓sqlite-3_x_y.zip文件,解壓后的文件是一個(gè)sqlite3.exe文件,將該可執(zhí)行文件放到安裝操作系統(tǒng)的名目下既可。運(yùn)行cmd命
令進(jìn)入命令行窗口,輸入sqlite3回車,你會(huì)看到第一行:sqliteversion3.x.y;其次行:Enter“.help”forinstructions;第三行:sqlite>(SQLite的命令提醒符)。在命令提醒符下輸入.help回車可以查看到提供的命令及解釋?,F(xiàn)在我們以前學(xué)習(xí)的SQL的一些常用命令就可以用了。
圖1SQLite3的內(nèi)部結(jié)構(gòu)
5.2常用函數(shù)簡(jiǎn)介
最新版本的SQLite提供的C語(yǔ)言接口的函數(shù)已有一百五十個(gè)但核心函數(shù)是下面介紹的幾個(gè),利用這幾個(gè)函數(shù)就可以實(shí)現(xiàn)有效的數(shù)據(jù)存儲(chǔ)和管理。
(1)sqlite3_open()
打開數(shù)據(jù)庫(kù)函數(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*/
);
第一個(gè)函數(shù)是打開UTF-8格式編碼的數(shù)據(jù)庫(kù);其次個(gè)函數(shù)是打開UTF-16格式編碼的數(shù)據(jù)庫(kù);第三個(gè)函數(shù)在沒有接收額外參數(shù)說(shuō)明的狀況下與第一個(gè)用法相同,這兩個(gè)額外的參數(shù)可以是下列的其中之一:SQLITEOPENREADONLY,SQLITEOPENREAD-WRITE,SQLITEOPENREADWRITE/SQLITEOPENCREATE。
sqlite3_open()打開指定的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)文件的路徑和名稱由flilename參數(shù)確定。假如文件不存在,就創(chuàng)建這個(gè)文件。文件打開或創(chuàng)建勝利,函數(shù)返回SQLITE_OK,同時(shí)通過(guò)ppDb參數(shù)返回合法的數(shù)據(jù)庫(kù)句柄,否則函數(shù)返回相應(yīng)的異樣代碼。
(2)sqlite3_close()
關(guān)閉數(shù)據(jù)庫(kù)函數(shù)原型:intsqlite3_close(sqlite3*db);
sqlite3_close()關(guān)閉已經(jīng)打開的數(shù)據(jù)庫(kù)。db參數(shù)傳遞的是被關(guān)閉數(shù)據(jù)庫(kù)的句柄。sqlite3_close()和sqlite3_open()是成對(duì)使用的,值得注重的是,當(dāng)sqlite3_open()打開數(shù)據(jù)庫(kù)失敗,ppDb指針參數(shù)返回一個(gè)無(wú)效的數(shù)據(jù)庫(kù)句柄時(shí),仍然需要調(diào)用sqlite3_close(),有效地釋放指針參數(shù)占用的資源。關(guān)閉已打開的數(shù)據(jù)庫(kù),勝利返回SQLITE?_OK,失敗返回SQLITE_ERROR,假如數(shù)據(jù)庫(kù)還沒有完成操作,將返回SQLITE_BUSY。
(3)sqlite3_exec()
執(zhí)行數(shù)據(jù)庫(kù)函數(shù)原型:
intsqlite3_exec(
sqlite3*,/*Anopendatabase*/
constchar*sql,/*SQLtobeevaluted*/
int(*callback)(void*,int,char**,char**),/*Callbackfunction*/
void*,/*1stargumenttocallback*/
char**errmsg/*Errormsgwrittenhere*/
);
這就是執(zhí)行一條sql語(yǔ)句的函數(shù)。第一個(gè)參數(shù)不再說(shuō)了,是前面open函數(shù)得到的指針,是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。其次個(gè)參數(shù)constchar*sql是一條sql語(yǔ)句,以\0結(jié)尾。第三個(gè)參數(shù)是回調(diào),當(dāng)這條語(yǔ)句執(zhí)行之后,SQLite3會(huì)去調(diào)用你提供的這個(gè)函數(shù)。第四個(gè)參數(shù)void*是你所提供的指針,你可以傳遞任何一個(gè)指針參數(shù)到這里,這個(gè)參數(shù)終于會(huì)傳到回調(diào)函數(shù)里面,假如不需要傳遞指針給回調(diào)函數(shù),可以填NULL。第五個(gè)參數(shù)char**errmsg是錯(cuò)誤信息。注重是指針的指針。SQLite3里面有無(wú)數(shù)固定的錯(cuò)誤信息。執(zhí)行sqlite3_exec之后,執(zhí)行失敗時(shí)可以查閱這個(gè)指針(直接printf(“%s\n”,errmsg))得到一串字符串信息,這串信息告知你錯(cuò)在什么地方。sqlite3_exec函數(shù)通過(guò)修改你傳入的指針的指針,把你提供的指針指向錯(cuò)誤提醒信息,這樣sqlite3_exec函數(shù)外面就可以通過(guò)這個(gè)char*得到詳細(xì)錯(cuò)誤提醒。
說(shuō)明:通常,sqlite3_callback和它后面的void*這兩個(gè)位置都可以填NULL。填NULL表示你不需要回調(diào)。比如你做insert操作,做delete操作,就沒有須要使用回調(diào)。而當(dāng)你做select時(shí),就要使用回調(diào),由于SQLite3把數(shù)據(jù)查出來(lái),得通過(guò)回調(diào)告知你查出了什么數(shù)據(jù)。
(4)出錯(cuò)處理函數(shù)
intsqlite3_errcode(sqlite3*db);
constchar*sqlite3_errmsg(sqlite3*);
constvoid*sqlite3_errmsg16(sqlite3*);
出錯(cuò)處理函數(shù)有上面的三個(gè)函數(shù)。第一個(gè)函數(shù)返回錯(cuò)誤代碼;其次個(gè)函數(shù)獵取最近一次操作錯(cuò)誤信息,對(duì)應(yīng)的是UTF-8編碼格式;第三個(gè)函數(shù)獵取最近一次操作錯(cuò)誤信息,對(duì)應(yīng)的是UTF-16編碼格式。
6SQLite在arm-linux平臺(tái)上的實(shí)現(xiàn)
SQLite嵌入式數(shù)據(jù)庫(kù)提供了以源碼發(fā)布的方式,要在眾多的硬件平臺(tái)舉行移植,可以按照不同平臺(tái)對(duì)源碼舉行交錯(cuò)編譯來(lái)實(shí)現(xiàn)。編譯主要有以下幾個(gè)步驟:
(1)用“echoPATH”命令查看PATH中是否已經(jīng)包含交錯(cuò)編譯工具arm-linux-gcc。
(2)到http://www.sqlite.org/下載最新的源代碼包(本文使用的是3.5.4版)sqlite-3.5.4.tar.gz使用tar命令舉行解壓,解壓完成后,進(jìn)入sqlite-3.5.4名目下可以看到源代碼和它的一些補(bǔ)充文件。
(3)為了在ARM9-linux下能正常運(yùn)行SQLite,需要對(duì)相關(guān)的文件作一些修改。將根名目下的Makefile.Linux-gcc拷貝并重命名為Makefile并使用vim對(duì)文件舉行相應(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【初中數(shù)學(xué)】平行線的性質(zhì)第1課時(shí)平行線的性質(zhì)課件 2024-2025學(xué)年七年級(jí)數(shù)學(xué)下冊(cè)(北師大版2024)
- 【初中數(shù)學(xué)】?jī)绲某顺?課時(shí)積的乘方課件 2024-2025學(xué)年北師大版七年級(jí)數(shù)學(xué)下冊(cè)
- led燈改造合同范例
- 2025-2030年便攜式移動(dòng)升降照明燈項(xiàng)目商業(yè)計(jì)劃書
- 分公司設(shè)立合同范例
- 2025-2030年伸縮鞋抽項(xiàng)目投資價(jià)值分析報(bào)告
- 做賬實(shí)操-出口貨物報(bào)關(guān)的流程
- 全數(shù)字化高檔全身應(yīng)用彩色多普勒超聲診斷儀技術(shù)參數(shù)
- 冷凍干貨買賣合同范例
- 書畫經(jīng)紀(jì)合同范例
- 武漢理工大學(xué)計(jì)算機(jī)網(wǎng)絡(luò)試題及答案
- 先學(xué)后教當(dāng)堂訓(xùn)練簡(jiǎn)介
- “順豐杯”第三屆全國(guó)大學(xué)生物流設(shè)計(jì)大賽案例
- 灌區(qū)工程施工方案與技術(shù)措施
- (完整)交叉作業(yè)施工方案
- 幼兒園繪本:《小蛇散步》 課件
- 華中師大版七年級(jí)心理 2走近老師 課件(共15張PPT)
- 裝配式建筑疊合板安裝技術(shù)交底
- 內(nèi)科學(xué)第八版循環(huán)系統(tǒng)教學(xué)大綱
- 1-100數(shù)字卡片(A4打印)
- 支氣管肺炎臨床路徑
評(píng)論
0/150
提交評(píng)論