梁永恩,萬世明,翟敏換(廣東白云學(xué)院電氣與信息工程學(xué)院,廣州 510450)
SQLite數(shù)據(jù)庫(kù)在嵌入式系統(tǒng)中的應(yīng)用研究
梁永恩,萬世明,翟敏換
(廣東白云學(xué)院電氣與信息工程學(xué)院,廣州 510450)
隨著用戶對(duì)數(shù)據(jù)處理和管理需求的不斷提高,越來越多的用戶希望能對(duì)嵌入式產(chǎn)品中的數(shù)據(jù)進(jìn)行更有效的管理。在嵌入式系統(tǒng)中大多采用文件或數(shù)據(jù)庫(kù)的方式對(duì)數(shù)據(jù)處理。傳統(tǒng)的小型嵌入式系統(tǒng)主要采用文件方式進(jìn)行數(shù)據(jù)處理,它主要存在以下缺點(diǎn)[1]:數(shù)據(jù)共享性差;可移植行差,不同系統(tǒng)之間難以重用;數(shù)據(jù)管理能力差,查詢和統(tǒng)計(jì)不便。而數(shù)據(jù)庫(kù)彌補(bǔ)了文件的缺點(diǎn),它具有以下優(yōu)點(diǎn):數(shù)據(jù)結(jié)構(gòu)化;數(shù)據(jù)的共享性高,冗余度低,易擴(kuò)充;數(shù)據(jù)獨(dú)立性高;具有安全性保護(hù)、完整性檢查、并發(fā)訪問控制、故障恢復(fù)等數(shù)據(jù)控制功能。嵌入式數(shù)據(jù)庫(kù)系統(tǒng)種類繁多,常用的嵌入式數(shù)據(jù)有:Advantage Database Server,Berkeley DB,Empress Embedded Database,eXtremeDB,InfinityDB,solidDB,SQL-ite,SQL Server Compact[2]。SQLite[3~4]數(shù)據(jù)庫(kù)以開源、跨平臺(tái)、體積小、安全性好、功能強(qiáng)大等優(yōu)點(diǎn)在嵌入式系統(tǒng)領(lǐng)域獲得了廣泛的應(yīng)用。
1.1SQlite簡(jiǎn)介
SQLite是一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),它包含一個(gè)C編程庫(kù),提供了簡(jiǎn)單易用的API訪問數(shù)據(jù)庫(kù)。采用模塊化設(shè)計(jì),主要包含四個(gè)模塊:核心(Core)、SQL編譯器(SQL Compiler)、后端(Backend)和附件(Accessories),其體系結(jié)構(gòu)如圖1所示。其中,接口(Interface)以SQLite3作為前綴,提供對(duì)數(shù)據(jù)庫(kù)訪問操作的API;分詞器(Tokenizer)的作用是把原始的字符串分割成標(biāo)記,然后一個(gè)一個(gè)的傳給語法分析器;語法分析器(Parser)通過分詞器產(chǎn)生的標(biāo)記分析語句的結(jié)構(gòu),并且得到一棵語法樹;代碼生成器(Code Generator)遍歷語法分析器生成的語法樹,產(chǎn)生執(zhí)行SQL語句需要的虛擬機(jī)代碼;虛擬機(jī)(Virtual Machine)用于執(zhí)行代碼生成器生成的代碼,它是數(shù)據(jù)庫(kù)中數(shù)據(jù)的最終操作者;B-tree模塊負(fù)責(zé)對(duì)數(shù)據(jù)的查找和排序;頁(yè)面緩存(pager)的任務(wù)是是讀、寫、緩存塊;操作系統(tǒng)接口(OS Interface)為SQLite與不同操作系統(tǒng)之間的操作提供了一個(gè)統(tǒng)一接口的抽象層。
1.2SQLite在嵌入式linux中的移植
(1)建立SQLite環(huán)境:
①?gòu)膆ttp://www.sqlite.org下載SQLite源碼包,此處下載的是sqlite-3.7.0.tar.gz。
②將下載的文件解壓,將sqlite-3.7.0.tar.gz解壓到/ home目錄下,然后在/home目錄下新建一個(gè)sqlite3-arm。
③設(shè)置交叉編譯環(huán)境并在解壓生成的sqlite-3.7.0目錄下執(zhí)行configure配置命令生成Makefile,注意修改配置項(xiàng)交叉編譯器host及存放編譯生成文件目錄prefix,這里設(shè)置host為arm-linux,prefix為sqlite3-arm。
④編譯并安裝SQLite。
圖1 SQLite體系結(jié)構(gòu)
(2)移植SQLite數(shù)據(jù)庫(kù):
①移植可執(zhí)行文件SQLite3,先用strip處理去掉其中的調(diào)試信息,為了減小執(zhí)行文件大小,再把SQLite3下載到開發(fā)板的/usr/bin目錄中
②移植庫(kù)文件,去掉libsqlite3.so.0.8.6文件的調(diào)試信息后將其拷貝到開發(fā)板目錄/usr/lib下,把libsqlite3.so 及l(fā)ibsqlite3.so.0鏈接到libsqlite3.so.0.8.6。
2.1SQLite常用API
除可在SQLite環(huán)境下執(zhí)行數(shù)據(jù)庫(kù)操作外,SQLite提供了C語言的API,常用的API如下:
(1)打開SQLite數(shù)據(jù)庫(kù)
int sqlite3_open(char*path,sqlite3**db);
說明:第1個(gè)參數(shù)為數(shù)據(jù)庫(kù)文件路徑,第2個(gè)參數(shù)為指向SQLite句柄的指針。執(zhí)行成功返回0,失敗返回錯(cuò)誤碼。
(2)關(guān)閉sqlite數(shù)據(jù)庫(kù)
int sqlite3_close(sqlite3*db);
說明:執(zhí)行成功返回0,失敗返回錯(cuò)誤碼。
(3)執(zhí)行SQL語句
int sqlite3_exec(sqlite3*,const char*sql,int(*callback)(void*,int,char**,char**),void*,char**errmsg);
說明:第1個(gè)參數(shù)為已打開的數(shù)據(jù)句柄的指針,第2個(gè)參數(shù)為一條SQL語句,第3個(gè)參數(shù)為回調(diào)函數(shù)(可填NULL),第4個(gè)參數(shù)為回調(diào)函數(shù)的第1個(gè)參數(shù)(可填NULL),第5個(gè)參數(shù)為錯(cuò)誤信息。
2.2SQLite在點(diǎn)餐終端系統(tǒng)中的應(yīng)用
在筆者實(shí)現(xiàn)的點(diǎn)餐終端系統(tǒng)中,選用SQLite數(shù)據(jù)庫(kù)作為點(diǎn)餐數(shù)據(jù)的存儲(chǔ)數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)包含多張表,包括菜單信息(菜品ID、菜品名、單價(jià)、簡(jiǎn)介)、訂單信息(訂單ID、臺(tái)號(hào)、菜品ID、數(shù)量等)、評(píng)價(jià)信息(訂單ID、菜品ID、評(píng)價(jià)等級(jí)等)。界面顯示使用Qt,通過調(diào)用SQLite3的接口函數(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的訪問操作,以下為部分代碼:
(1)數(shù)據(jù)庫(kù)操作相關(guān)變量
sqlite3*db;//數(shù)據(jù)庫(kù)
char*errmsg=NULL;//錯(cuò)誤信息
int ret;
int rownum;//列數(shù)
int columnnum;//行數(shù)
char**pazResult; //數(shù)據(jù)查詢結(jié)果
(2)打開ordering數(shù)據(jù)庫(kù)
ret=sqlite3_open("ordering.db",&db);if(ret!=SQLITE_OK)
{qDebug()<<"sqlite3 open error";}
(3)新建menu菜單信息表
//創(chuàng)建表,表中包含4個(gè)字段:菜品ID、菜品名、單價(jià)、簡(jiǎn)介
ret=sqlite3_exec(db,"create table menu(menuid varchar (10)PRIMARY KEY,name varchar(20),price float,summary varchar(80))",NULL,NULL,&errmsg);
if(ret!=SQLITE_OK)
{qDebug()<<"create table error";}
(4)插入數(shù)據(jù)到menu表
ret=sqlite3_exec(db,"insert into menu values('001','精選肥牛',35,'肉質(zhì)細(xì)嫩,營(yíng)養(yǎng)豐富')",NULL,NULL,&zErr Msg)
(5)界面顯示
//可用QTableWidget控件顯示表數(shù)據(jù)
QString name;//菜品名稱
QString price;//單價(jià)
QString count;//菜品數(shù)量
int i,j,index;
QTableWidget*mytable=new QTableWidget(this);
//創(chuàng)建一個(gè)QTableWidget控件
mytable->setColumnCount(3);//設(shè)置列數(shù)為3
QStringListheadstrList;
headstrList<<"名稱"<<"單價(jià)(元)"<<"數(shù)量";
mytable->setHorizontalHeaderLabels(headstrList);
//設(shè)置表頭
ret=sqlite3_get_table(db,“select*from order”,&paz Result,&rownum,&columnnum,&errmsg);
if(ret==SQLITE_OK)
{index=columnnum;//第一行數(shù)據(jù)是字段名稱,從columnnum索引開始才是真正的數(shù)據(jù)
for(i=0;i<rownum;i++)
{//讀取訂單信息表中的數(shù)據(jù),逐行置于name、price、count變量中,然后將數(shù)據(jù)插入表格控件中
name=QString(pazResult[index++]);
mytable->setItem(i,0,new QTableWidgetItem(name);
price=QString(pazResult[index++]);
mytable->setItem(i,1,newQTableWidgetItem(price);count=QString(pazResult[index++]);
mytable->setItem(i,2,new QTableWidgetItem(count);
}
…
界面顯示效果如圖2所示。
圖2 界面顯示效果
本文介紹了SQLite數(shù)據(jù)庫(kù)的特點(diǎn)和體系結(jié)構(gòu),給出了SQLite在嵌入式Linux中的移植過程,并結(jié)合點(diǎn)餐終端系統(tǒng)實(shí)例講解SQLite的應(yīng)用方法。實(shí)踐表明,在嵌入式系統(tǒng)中應(yīng)用SQLite,系統(tǒng)運(yùn)行穩(wěn)定,數(shù)據(jù)庫(kù)響應(yīng)迅速,可有效滿足嵌入式系統(tǒng)領(lǐng)域?qū)?shù)據(jù)管理的需求。
[1]謝輝.嵌入式數(shù)據(jù)庫(kù)的設(shè)計(jì)與實(shí)現(xiàn)[D].太原:太原科技大學(xué),2008
[2]蔡勇,王勇.嵌入式數(shù)據(jù)庫(kù)SQLite在測(cè)控系統(tǒng)設(shè)計(jì)中的應(yīng)用[J].電子測(cè)試,2011(10):89~93
[3]唐敏,宋杰.嵌入式數(shù)據(jù)庫(kù)SQLite的原理與應(yīng)用[J].電腦知識(shí)與技術(shù),2008(02):51~54
[4]解輝,徐玉斌,李建偉,等.基于SQLite的嵌入式數(shù)據(jù)采集系統(tǒng)的研究[J].計(jì)算機(jī)與數(shù)字工程,2008(6):91~94
SQLite;Embedded System;Database
Research on the Application of SQLite Database in Embedded System
LIANG Yong-en,WAN Shi-ming,ZHAI Ming-huan
(School of Electrical and Information Engineering,Guangdong Baiyun University,Guangzhou 510450)
1007-1423(2015)10-0060-03
10.3969/j.issn.1007-1423.2015.10.017
梁永恩(1978-),男,廣東廣州人,碩士研究生,講師,研究方向?yàn)榍度胧较到y(tǒng)
萬世明(1955-),男,湖北武漢人,碩士研究生,教授,研究方向?yàn)橄到y(tǒng)工程
翟敏煥(1983-),女,廣東佛山人,碩士研究生,講師,研究方向?yàn)樽詣?dòng)控制
2015-01-29
2015-03-12
分析SQLite數(shù)據(jù)庫(kù)的特點(diǎn)及結(jié)構(gòu),給出SQLite數(shù)據(jù)庫(kù)在嵌入式Linux系統(tǒng)的移植過程,并結(jié)合具體事例介紹SQLite的應(yīng)用。實(shí)踐表明,在嵌入式系統(tǒng)應(yīng)用SQLite數(shù)據(jù)庫(kù),可有效提高嵌入式系統(tǒng)處理數(shù)據(jù)處理能力,簡(jiǎn)化數(shù)據(jù)處理過程和提高數(shù)據(jù)管理的效率。
SQLite;嵌入式系統(tǒng);數(shù)據(jù)庫(kù)
廣東白云學(xué)院2013年度科研項(xiàng)目(No.BYKY201319)
Analyzes the characteristics and the structure of the SQLite,gives the migration process of embedded Linux system with SQLite,and gives an example of the application of SQLite.Practice shows that the ability of embedded system can be effectively improved to deal with the data processing,simplify data processing and improve the efficiency of data management by using SQLite.