版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年人民版九年級歷史上冊階段測試試卷含答案
- 二零二五版農(nóng)村集體資產(chǎn)農(nóng)民房屋租賃合同2篇
- 2025年度智能化農(nóng)場承包經(jīng)營合同4篇
- 二零二五年度建筑幕墻施工安全協(xié)議合同4篇
- 二零二五年度健康營養(yǎng)面包研發(fā)與訂購合同4篇
- 二零二五版專業(yè)攝影棚場地租賃及拍攝服務(wù)合同范本4篇
- 2025年度木飾面產(chǎn)品市場推廣與廣告投放合同
- 房屋抵債合同(2篇)
- 2025版南京商業(yè)地產(chǎn)租賃稅費結(jié)算合同4篇
- 著火場景的火源辨識與處置
- 紅色革命故事《王二小的故事》
- 《白蛇緣起》賞析
- 海洋工程用高性能建筑鋼材的研發(fā)
- 蘇教版2022-2023學(xué)年三年級數(shù)學(xué)下冊開學(xué)摸底考試卷(五)含答案與解析
- 英語48個國際音標(biāo)課件(單詞帶聲、附有聲國際音標(biāo)圖)
- GB/T 6892-2023一般工業(yè)用鋁及鋁合金擠壓型材
- 冷庫安全管理制度
- 2023同等學(xué)力申碩統(tǒng)考英語考試真題
- 家具安裝工培訓(xùn)教案優(yōu)質(zhì)資料
- 在雙減政策下小學(xué)音樂社團活動有效開展及策略 論文
- envi二次開發(fā)素材包-idl培訓(xùn)
評論
0/150
提交評論