SQLite嵌入式數據庫系統的研究與實(shí)現
引 言
本文引用地址:http://dyxdggzs.com/article/89403.htm 隨著(zhù)嵌入式系統的廣泛應用及用戶(hù)對數據處理和管理需求的不斷提高,各種智能設備與數據庫技術(shù)的緊密結合得到重視。這種數據庫不僅具有傳統數據庫的主要功能,還具有嵌入式和支持移動(dòng)技術(shù)兩種特性,因此通常被用在掌上電腦、PDA、車(chē)載設備、移動(dòng)電話(huà)等嵌入式設備中。這種數據庫技術(shù)的興起使人們不再受單一操作系統的限制,可以隨時(shí)隨地處理業(yè)務(wù)、傳遞信息??梢哉f(shuō),嵌入式數據庫的發(fā)展提高了數據信息接入的普遍性,使人們隨時(shí)隨地獲取信息的愿望成為可能。
1 嵌入式數據庫系統的體系結構
嵌入式數據庫將數據庫系統與操作系統和具體應用集成在一起,運行在各種智能嵌入式設備上。與傳統的數據庫系統相比,它一般體積較小,有較強的便攜性和易用性,以及較為完備的功能來(lái)實(shí)現用戶(hù)對數據的管理操作。但是,由于嵌入式系統的資源限制,它無(wú)法作為一個(gè)完整的數據庫來(lái)提供大容量的數據管理,而且嵌入式設備可隨處放置,受環(huán)境影響較大,數據可靠性較低。在實(shí)際應用中,為了彌補嵌入式數據庫存儲容量小、可靠性低的不足,通常在PC機上配置后臺數據庫來(lái)實(shí)現大容量數據的存儲和管理。嵌入式數據庫作為前端設備,需要一個(gè)GUI交互界面來(lái)實(shí)現嵌入式終端上的人機交互,并通過(guò)串口實(shí)現和PC機上主數據源之間的數據交換,實(shí)現系統服務(wù)器端數據的管理,接收嵌入式終端上傳的數據和下載數據到嵌入式終端機等操作。
2 SQLite的體系結構及開(kāi)發(fā)技術(shù)
SQLite是D·理查德·希普開(kāi)發(fā)的用一個(gè)小型C庫實(shí)現的一種強有力的嵌入式關(guān)系數據庫管理體制。它提供對SQL92的大多數支持:多表、索引、事務(wù)、視圖、觸發(fā)和一系列的用戶(hù)接口及驅動(dòng)。
2.1 SQLite的體系結構
SQLite可以分成8個(gè)主要子系統,如圖1所示。頂層是標記處理器(tokenizer)和分析器(parser)。高度優(yōu)化的分析生成器可以快速生成高效率的代碼。底部是基于Knuth經(jīng)過(guò)優(yōu)化的B樹(shù)。這樣可以運行在可調整的頁(yè)面緩沖(pagecache)上,有助于將對磁盤(pán)的查找減到最少。再往下是頁(yè)面高速緩存。它作用在OS的抽象層之上,這樣的安排有助于數據庫的移動(dòng)。體系結構的核心是虛擬數據庫引擎(VDBE)。VDBE完成與數據操作相關(guān)的全部操作并且是客戶(hù)和儲存之間進(jìn)行信息交換的中間單元。它是SQLite的核心。在SQL語(yǔ)句被分析之后,VDBE開(kāi)始起作用。代碼生成器將分析樹(shù)翻譯成一個(gè)袖珍程序,隨后這些袖珍程序被組合成用VDBE虛擬機器語(yǔ)言表示的一系列指令。如此往復,VDBE執行每條指令,最終完成SQL語(yǔ)句指定的查詢(xún)要求。VDBE的機器語(yǔ)言由圍繞數據庫管理的128個(gè)操作碼(op—code)組成。對于打開(kāi)表、查詢(xún)索引、存儲和刪除記錄以及很多其他數據庫操作都有對應的操作碼。VDBE里的每條指令由1個(gè)操作碼和3個(gè)操作數(operand)組成。一些指令使用全部3個(gè)操作數,也有些指令一個(gè)也未使用。這完全取決于指令的性質(zhì)。例如Open指令用于打開(kāi)一個(gè)表的指針,使用了全部3個(gè)操作數:第1個(gè)操作數(P1)包含指針的ID號,第2個(gè)操作數(P2)指出表的根位置(或者表的首頁(yè)位置),第3個(gè)操作數是表的名字。
2.2 SQLite開(kāi)發(fā)技術(shù)
SQLite的API易于使用,只需要3個(gè)用來(lái)執行SQL和獲得數據的函數。它還是可擴展的,允許程序員自定義函數,然后通過(guò)callback()函數集合進(jìn)去。開(kāi)放源碼團體已經(jīng)擴展了眾多的客戶(hù)接口、適配器、驅動(dòng)等,這就使得其他語(yǔ)言使用SQLite也成為可能。
使用C語(yǔ)言API只需要三步。首先,提供文件名和訪(fǎng)問(wèn)模式,來(lái)調用sqlite_open()連接數據庫。然后,執行callback()函數,SQLite通過(guò)對每個(gè)記錄執行callback()函數獲得從數據庫那里得到的結果。最后,如果想執行一個(gè)SQL查詢(xún)并獲得一個(gè)callback()函數的指針,可以調用sqlite_exec()。另外還可以調用sqlite3_get_table()函數獲得數據表單的內容。
SQLite還提供了存取二進(jìn)制大對象(BLOB)的方法,同時(shí)在線(xiàn)程安全、數據庫管理、API的擴展等方面也都提供了強大方便的技術(shù)支持。
3 SQLite在A(yíng)RM9開(kāi)發(fā)板上的編譯及拷貝
在SQLite官方網(wǎng)www.sqlite.org下載SQLite-3.3.8版本,在終端解壓生成SQLite-3.3.8目錄。進(jìn)入此目錄,對sqlite/src/sqliteInt.h作一定的修改,以確保btree(B樹(shù))有正確的變量大小。不同體系結構的Linux會(huì )有些差別。對于A(yíng)RM-Linux可找到如下部分:
這樣后面的“typedef INTPTR_TYPE ptr;”就定義為“int”類(lèi)型,而不是“long long”。
修改configure文件的內容,注釋掉相關(guān)代碼,讓系統不去檢查交叉編譯環(huán)境,否則會(huì )出現錯誤,不能生成Makefile文件。然后新建一個(gè)文件夾sqlite-arm-linux來(lái)保存將要生成的庫文件,運行以下命令進(jìn)行配置:
將在本目錄下生成Makefile文件。修改Makefile文件中如下語(yǔ)句,指定主機編譯器為GCC:
這時(shí)就可以運行make & & make install命令開(kāi)始編譯,若無(wú)其他錯誤提示,則會(huì )在/../sqlite-3.3.8/sqlite-arm-linux/lib目錄下生成庫文件。主要有libsqlite3.so、libsqlite3.so.O、libsqlite3.so.O.8.6三個(gè)文件。同時(shí)在bin文件夾下生成了可執行文件sqlite3。為了減小執行文件大小,用strip命令處理去掉其中的調試信息。
庫文件生成后,可以通過(guò)NFS(網(wǎng)絡(luò )文件系統)把相關(guān)庫文件拷貝到ARM開(kāi)發(fā)板上,設置好主機NFS服務(wù)器,啟動(dòng)目標板后,執行:
其中192.168.1.101為NFS服務(wù)器IP,這樣就把sqlite庫文件所在文件夾掛載到了目標板上,拷貝時(shí)注意加上-arf選項,因為libsqlite3.so和libsqlite3.so.O是鏈接到Iibsqlite3.so.O.8.6的。
4 嵌入式數據庫系統設計及實(shí)現
對嵌入式系統而言,強大的圖形用戶(hù)接口使系統的功能更加豐富。目前有眾多的GUI可供使用,考慮到授權和價(jià)格的因素,我們在Qt/Embedded基礎上進(jìn)行數據庫界面程序的開(kāi)發(fā),完成嵌入式數據庫系統的設計。Qt良好的封裝機制使Qt的模塊化程度非常高,可重用性較好。嵌入式數據庫系統的基本結構如圖2所示。
通過(guò)Qt的QTable控件來(lái)實(shí)現數據表單的顯示,通過(guò)QListView、QC20mBobox以及QTextEdit等控件進(jìn)行數據表單的選擇、數據輸入等,配合PushButton控件實(shí)現數據表的創(chuàng )建、刪除和數據查詢(xún)、添加、刪除、修改等操作。這樣,實(shí)現數據庫系統的基本管理,并可利用串口實(shí)現與后臺數據庫之間的數據交互。本系統利用Qt Designer實(shí)現數據庫界面的快速開(kāi)發(fā),并通過(guò)調用SQLite的API接口函數實(shí)現數據庫的基本操作。下面簡(jiǎn)要介紹一下用QtDesigner開(kāi)發(fā)數據庫界面的基本方法及關(guān)鍵代碼。新建一個(gè)C++項目,在此基礎上新建一個(gè)窗口部件,在窗口部件上添加一個(gè)Table控件作為數據表單的顯示界面。另根據需要,添加PushButton控件以實(shí)現相應的操作。在窗口類(lèi)下新建一個(gè)槽,命名為SelectSlot()。連接相關(guān)按鈕信號,關(guān)鍵代碼如下:
其中tableView函數的作用是將查詢(xún)得到的數據表顯示在Table控件中。函數體程序如下:
終端下進(jìn)入工程目錄,修改*.pro文件,并添加如下內容:
這里加入了編譯程序所需庫文件的路徑以及sqlite.h頭文件的路徑。這一切做好后,開(kāi)始編譯。
tmake-o Makefile EDBMS.pro生成Makefile,將其中的編譯工具改為arm-linux-g++,加上交叉編譯的相關(guān)庫文件。然后make編譯,生成能在A(yíng)RM開(kāi)發(fā)板上運行的二進(jìn)制文件,并且通過(guò)NFS掛載到開(kāi)發(fā)板上。運行./EDBMS,會(huì )出現我們設計的窗口界面。查詢(xún)一個(gè)數據表的內容并顯示在QTable控件上,主界面效果如圖3所示。
另外,系統運用SQL Servqr。2000作為后臺數據庫,用VB 6.O開(kāi)發(fā),通過(guò)ODBC與數據庫連接,實(shí)現后臺數據庫管理,并負責接收和處理客戶(hù)端請求。PC機與嵌入設備端則可以通過(guò)串口進(jìn)行通信,以完善系統功能。這樣,一個(gè)較為完備的嵌入式數據庫系統就構建起來(lái)了。
結 語(yǔ)
本文在對嵌入式數據庫特性研究的基礎上,設計出一種嵌入式數據庫系統的體系結構。結合嵌入式數據庫的特點(diǎn),運用SQLite在A(yíng)RM-Linux平臺上構建嵌入式數據庫系統。在此基礎上利用Qt設計了數據庫界面,使用SQLite的API實(shí)現數據庫的基本操作。最后對后臺數據庫的配置及串口通信機制做了簡(jiǎn)要介紹,完成了整個(gè)嵌入式數據庫系統的構建。
評論