在對(duì)移動(dòng)嵌入式數(shù)據(jù)庫(kù)中BLOB數(shù)據(jù)類(lèi)型分析的基礎(chǔ)上,使用C語(yǔ)言的API函數(shù)調(diào)用移動(dòng)SQLite數(shù)據(jù)庫(kù)語(yǔ)句,并按其訪問(wèn)模式調(diào)用連接函數(shù),實(shí)現(xiàn)了SQLite移動(dòng)數(shù)據(jù)庫(kù)中二進(jìn)制大對(duì)象和C結(jié)構(gòu)體類(lèi)型數(shù)組的BLOB處理方法。隨著圖像和音視頻數(shù)據(jù)的日益增多,BLOB數(shù)據(jù)類(lèi)型在SQLite中的應(yīng)用將更為廣闊,給出的Demo實(shí)例驗(yàn)證了這一技術(shù)的有效性。
SQLite移動(dòng)數(shù)據(jù)庫(kù) BLOB類(lèi)型 嵌入式開(kāi)發(fā)
中圖分類(lèi)號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-1010(2014)-06-
1 引言
移動(dòng)嵌入式數(shù)據(jù)庫(kù)一直是一個(gè)熱點(diǎn)應(yīng)用開(kāi)發(fā),作為輕量級(jí)嵌入式移動(dòng)數(shù)據(jù)庫(kù)的典型,SQLite有許多令人印象深刻的優(yōu)點(diǎn),包括:具有開(kāi)放源代碼;自身程序特別?。恢С执蠖鄶?shù)SQL命令;速度極快;直接創(chuàng)建數(shù)據(jù)庫(kù),不需要服務(wù)器支持;簡(jiǎn)潔的C語(yǔ)言API(Application Programming Interface,應(yīng)用程序編程接口)接口。它具有的零配置安裝可在系統(tǒng)崩潰或電源故障時(shí)自動(dòng)恢復(fù),且數(shù)據(jù)被存儲(chǔ)在單一的物理文件中,數(shù)據(jù)庫(kù)運(yùn)行在同一個(gè)相互間無(wú)通信的進(jìn)程,訪問(wèn)數(shù)據(jù)庫(kù)的程序直接從文件讀取和寫(xiě)入磁盤(pán),數(shù)據(jù)的讀寫(xiě)速度快,具有高達(dá)2TB的存儲(chǔ)容量,在提供了存儲(chǔ)BLOB(Binary Large Object,二進(jìn)制大對(duì)象)方法的同時(shí),API擴(kuò)展等也提供了強(qiáng)有力的技術(shù)支撐;存儲(chǔ)在SQLite數(shù)據(jù)庫(kù)BLOB數(shù)據(jù)類(lèi)型的輸入數(shù)據(jù)無(wú)需任何轉(zhuǎn)換,數(shù)據(jù)本身的屬性就是表的列屬性[1]。
2 BLOB技術(shù)原理
BLOB數(shù)據(jù)類(lèi)型是適合用于存儲(chǔ)可變長(zhǎng)度的二進(jìn)制大對(duì)象數(shù)據(jù)以及可變長(zhǎng)度的音頻和視頻數(shù)據(jù)。在SQLite的BLOB類(lèi)型中存儲(chǔ)復(fù)雜的數(shù)據(jù)時(shí),長(zhǎng)度是不加限制的[2]。使用B-樹(shù)索引來(lái)管理和組織屬性數(shù)據(jù),通過(guò)SQL語(yǔ)句到數(shù)據(jù)庫(kù)相關(guān)數(shù)據(jù)中實(shí)現(xiàn)增、刪、改、查的操作。SQLite不支持靜態(tài)數(shù)據(jù)類(lèi)型,而是使用列關(guān)系。當(dāng)數(shù)據(jù)記錄的字段內(nèi)容插入到數(shù)據(jù)庫(kù)中時(shí),SQLite將對(duì)該字段內(nèi)容的類(lèi)型做檢查,若類(lèi)型不能匹配到相關(guān)聯(lián)的列,則SQLite會(huì)將該字段內(nèi)容轉(zhuǎn)換成列的類(lèi)型。因此,數(shù)據(jù)庫(kù)中BLOB數(shù)據(jù)類(lèi)型的合理應(yīng)用也直接影響存儲(chǔ)效率和查詢速度的提高。
3 BLOB類(lèi)型在SQLite中的應(yīng)用
3.1 SQLite的API函數(shù)
嵌入式移動(dòng)數(shù)據(jù)庫(kù)SQLite使用C語(yǔ)言API等接口,在此基礎(chǔ)上的擴(kuò)展也可用于其他語(yǔ)言的SQLite的接口[3]。以下是SQLite中常用的對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的函數(shù):
(1)創(chuàng)建和打開(kāi)數(shù)據(jù)庫(kù)
int sqlite3_open(const char*,sqlite3**db);
功能是當(dāng)數(shù)據(jù)庫(kù)文件存在時(shí),可以打開(kāi)已存在的數(shù)據(jù)庫(kù);若不存在,則創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)文件并打開(kāi),且能通過(guò)輸入?yún)?shù)返回連接。
(2)運(yùn)行函數(shù)
int sqlite3_exec(sqlite3*,const char*sql,sqlite_callback,void*,char**em);
*sql是運(yùn)行的SQL語(yǔ)句,該語(yǔ)句可按實(shí)際需要編寫(xiě)一條或多條;sqlite_callback是一個(gè)回調(diào)函數(shù),根據(jù)實(shí)際可編寫(xiě)回調(diào)函數(shù)從數(shù)據(jù)庫(kù)中獲取需要的結(jié)果。
(3)預(yù)編譯SQL語(yǔ)句的函數(shù)
int sqlite3_prepare(sqlite3*db,const char*iSql,int jByte,sqlite3_stmt**pStmt,const char**pl);
該函數(shù)需要一個(gè)數(shù)據(jù)庫(kù)連接的指針,將給定的SQL文本轉(zhuǎn)換為預(yù)聲明語(yǔ)句對(duì)象并返回一個(gè)指向它的指針,這個(gè)函數(shù)并不執(zhí)行SQL語(yǔ)句,只是預(yù)編譯和解析SQL文本,準(zhǔn)備執(zhí)行。
(4)查詢函數(shù)
int sqlite3_get_table(sqlite3*,const char*sql,char ***ret,int*nrow,int*ncol,char**em);
功能是無(wú)需回調(diào)函數(shù)處理,直接能查詢結(jié)果集。
3.2 SQLite數(shù)據(jù)庫(kù)BLOB類(lèi)型應(yīng)用實(shí)例
(1)SQLite二進(jìn)制大對(duì)象處理技術(shù)
在實(shí)際編程開(kāi)發(fā)中,往往是進(jìn)行二進(jìn)制大對(duì)象數(shù)據(jù)的訪問(wèn),如圖像、音視頻等。對(duì)于這些數(shù)據(jù)不能像對(duì)待普通的文本一樣插入或查詢那樣簡(jiǎn)單,而是將圖像等文件在使用Insert或Update語(yǔ)句時(shí)先用通配符‘?代替,通配符‘?表示未定值是一個(gè)占位符,然后通過(guò)sqlite3_bind_blob綁定到Insert或Update中,替換‘?部分并存儲(chǔ)。如果是字符串,則還需要通過(guò)sqlite3_bind_parameter_index()獲取對(duì)應(yīng)的index,然后再調(diào)用sqlite3_bind_blob()操作。通常也用于構(gòu)造不定條件的動(dòng)態(tài)SQL語(yǔ)句。
以下的Demo1.c程序就實(shí)現(xiàn)了SQLite數(shù)據(jù)庫(kù)中圖像的存取處理[4]:
//創(chuàng)建表函數(shù)
int CreateTab(sqlite3*db)
{char*EM=0; //*EM指針?lè)祷劐e(cuò)誤消息
char*sql="CREATE TABLE xuch(BH primart key,MC varchar(10),SL int,SB blob); "
if(SQLITE_OK)!=sqlite3_exec(db, 0,0,&EM))
{printf(" failed:%s\n",EM);}
}
//插入數(shù)據(jù)記錄并處理大對(duì)象數(shù)據(jù)函數(shù)
int InsertRec(sqlite3*db)
{……endprint
char*sql="INSERT INTO xuch(BH,MC,SL) VALUES(‘20121001,Computer,20); "
……
char*sql="UPDATE xuch SET SB=? WHERE MC='Computer';" //‘?通配符是占位符代替二進(jìn)制文件
}
……//此處需應(yīng)有為占位符‘?所提供的圖像視頻等大對(duì)象文件的打開(kāi)等操作
sqlite3_bind_blob(stmt, 1, fl, fs, NULL);//調(diào)用該函數(shù)使Update中‘?代表的參數(shù)傳入對(duì)應(yīng)字段,其中的stmt記錄了SQL語(yǔ)句。
如果有多個(gè)‘?,就需要寫(xiě)出多個(gè)sqlite3_bind_blob語(yǔ)句,并改變它們的第2個(gè)參數(shù)即可替換到不同的‘?。最后使用sqlite3_step將二進(jìn)制數(shù)據(jù)保存到對(duì)應(yīng)的數(shù)據(jù)庫(kù)中。
(2)C結(jié)構(gòu)體類(lèi)型在BLOB中的處理技術(shù)
將一個(gè)結(jié)構(gòu)體數(shù)據(jù)以二進(jìn)制的方式寫(xiě)入到SQLite數(shù)據(jù)庫(kù)的BLOB類(lèi)型中,并顯示出結(jié)果。
Demo2.c程序主要代碼如下所示,其中personal是一個(gè)結(jié)構(gòu)體數(shù)組。
sqlite3*db;
sqlite3_open("test.db", &db);
sqlite3_stmt*stmt;
typedef struct xuchunhua
{ int no;
char name[10];
bool sex;
}teacher;
teacher personal[20];
……
personal[1].no=10;
strcpy(personal[1].name,“LiuBing”);
personal[i].bool=1;
……
result=sqlite3_exec(db,"create table xuch(bh text,jg blob)", 0,0,&perrmsg); //創(chuàng)建對(duì)應(yīng)的表,這里用到了blob類(lèi)型
result=sqlite3_prepare(db,"insert into xuch values(?,?)",-1,&stmt,0); //插入數(shù)據(jù),這里采用預(yù)編譯的形式,凡是二進(jìn)制的數(shù)據(jù)都要這樣處理[5]
……
void*buffer ; //創(chuàng)建內(nèi)存指針
buffer=new char(sizeof(teacher)); //初始化存儲(chǔ)空間,sizeof(teacher)為結(jié)構(gòu)體大小
……
result=sqlite3_bind_text(stmt,1,“X1001”, -1,NULL); //綁定表的第一個(gè)字段,這里為text類(lèi)型
result=sqlite3_bind_blob(stmt,2,buffer,sizeof(teacher),NULL); //綁定blob類(lèi)型
result=sqlite3_step(stmt); //執(zhí)行sql語(yǔ)句,這樣就把數(shù)據(jù)存到數(shù)據(jù)庫(kù)里了
……
result=sqlite3_prepare(db,"select jg from xuch
where bh=“X1001”,-1,&stmt,0); //查找一行的數(shù)據(jù)
result=sqlite3_step(stmt);
if(result==SQLITE_ROW)
{
int blob_size=sqlite3_column_bytes(stmt,0)/sizeof(teacher); //獲取數(shù)組的長(zhǎng)度
personal1=(teacher*)sqlite3_column_blob(stmt,0); //獲取數(shù)組的頭指針
for(int i=0 ;i {printf("%d",personal[i].sno); printf("%s",personal[i].sname; //輸出數(shù)據(jù) ……} } sqlite3_finalize(stmt); sqlite3_close(db); 4 結(jié)束語(yǔ) SQLite提供了存取二進(jìn)制大對(duì)象BLOB的方法,在嵌入式移動(dòng)數(shù)據(jù)庫(kù)開(kāi)發(fā)中,可對(duì)二進(jìn)制大對(duì)象和C結(jié)構(gòu)體使用BLOB類(lèi)型數(shù)據(jù)處理。SQLite移動(dòng)數(shù)據(jù)庫(kù)的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用,它占用的資源非常低。SQLite嵌入式移動(dòng)數(shù)據(jù)庫(kù)的易用性,可加快應(yīng)用程序的開(kāi)發(fā),完全支持復(fù)雜的SQL,對(duì)于小型設(shè)備的有限空間來(lái)說(shuō)是特別重要的應(yīng)用。此外,SQL還支持原子的、一致的、獨(dú)立的和持久的(ACID)事務(wù)。SQLite允許多個(gè)進(jìn)程同時(shí)打開(kāi)一個(gè)數(shù)據(jù)庫(kù),同時(shí)讀取數(shù)據(jù)庫(kù)實(shí)現(xiàn)并發(fā)處理。隨著應(yīng)用的廣泛,在移動(dòng)數(shù)據(jù)庫(kù)中具有越來(lái)越多的圖像數(shù)據(jù)、大文本數(shù)據(jù)、音頻和視頻數(shù)據(jù),在SQLite中BLOB數(shù)據(jù)類(lèi)型的應(yīng)用將更為廣闊。 參考文獻(xiàn): [1] Michael Owens. The Definitive Guide to SQLite[M]. Berkeley: Apress, 2006. [2] 葉宏祥. 移動(dòng)存儲(chǔ)關(guān)鍵性技術(shù)的研究及進(jìn)展[J]. 移動(dòng)通信, 2009(11): 32-34. [3] The Architecture of SQLite[EB/OL]. [2013-08-21]. http://www.sqlite.org/arch.html. [4] 劉玉海,劉冰. SQLite嵌入式數(shù)據(jù)庫(kù)及圖象處理技術(shù)研究[J]. 軟件, 2012(8): 102-104. [5] C/C++ Interface for SQLite Version3[EB/OL]. [2013-08-21]. http://www.sqlite.org/capi3ref.html.★
char*sql="INSERT INTO xuch(BH,MC,SL) VALUES(‘20121001,Computer,20); "
……
char*sql="UPDATE xuch SET SB=? WHERE MC='Computer';" //‘?通配符是占位符代替二進(jìn)制文件
}
……//此處需應(yīng)有為占位符‘?所提供的圖像視頻等大對(duì)象文件的打開(kāi)等操作
sqlite3_bind_blob(stmt, 1, fl, fs, NULL);//調(diào)用該函數(shù)使Update中‘?代表的參數(shù)傳入對(duì)應(yīng)字段,其中的stmt記錄了SQL語(yǔ)句。
如果有多個(gè)‘?,就需要寫(xiě)出多個(gè)sqlite3_bind_blob語(yǔ)句,并改變它們的第2個(gè)參數(shù)即可替換到不同的‘?。最后使用sqlite3_step將二進(jìn)制數(shù)據(jù)保存到對(duì)應(yīng)的數(shù)據(jù)庫(kù)中。
(2)C結(jié)構(gòu)體類(lèi)型在BLOB中的處理技術(shù)
將一個(gè)結(jié)構(gòu)體數(shù)據(jù)以二進(jìn)制的方式寫(xiě)入到SQLite數(shù)據(jù)庫(kù)的BLOB類(lèi)型中,并顯示出結(jié)果。
Demo2.c程序主要代碼如下所示,其中personal是一個(gè)結(jié)構(gòu)體數(shù)組。
sqlite3*db;
sqlite3_open("test.db", &db);
sqlite3_stmt*stmt;
typedef struct xuchunhua
{ int no;
char name[10];
bool sex;
}teacher;
teacher personal[20];
……
personal[1].no=10;
strcpy(personal[1].name,“LiuBing”);
personal[i].bool=1;
……
result=sqlite3_exec(db,"create table xuch(bh text,jg blob)", 0,0,&perrmsg); //創(chuàng)建對(duì)應(yīng)的表,這里用到了blob類(lèi)型
result=sqlite3_prepare(db,"insert into xuch values(?,?)",-1,&stmt,0); //插入數(shù)據(jù),這里采用預(yù)編譯的形式,凡是二進(jìn)制的數(shù)據(jù)都要這樣處理[5]
……
void*buffer ; //創(chuàng)建內(nèi)存指針
buffer=new char(sizeof(teacher)); //初始化存儲(chǔ)空間,sizeof(teacher)為結(jié)構(gòu)體大小
……
result=sqlite3_bind_text(stmt,1,“X1001”, -1,NULL); //綁定表的第一個(gè)字段,這里為text類(lèi)型
result=sqlite3_bind_blob(stmt,2,buffer,sizeof(teacher),NULL); //綁定blob類(lèi)型
result=sqlite3_step(stmt); //執(zhí)行sql語(yǔ)句,這樣就把數(shù)據(jù)存到數(shù)據(jù)庫(kù)里了
……
result=sqlite3_prepare(db,"select jg from xuch
where bh=“X1001”,-1,&stmt,0); //查找一行的數(shù)據(jù)
result=sqlite3_step(stmt);
if(result==SQLITE_ROW)
{
int blob_size=sqlite3_column_bytes(stmt,0)/sizeof(teacher); //獲取數(shù)組的長(zhǎng)度
personal1=(teacher*)sqlite3_column_blob(stmt,0); //獲取數(shù)組的頭指針
for(int i=0 ;i {printf("%d",personal[i].sno); printf("%s",personal[i].sname; //輸出數(shù)據(jù) ……} } sqlite3_finalize(stmt); sqlite3_close(db); 4 結(jié)束語(yǔ) SQLite提供了存取二進(jìn)制大對(duì)象BLOB的方法,在嵌入式移動(dòng)數(shù)據(jù)庫(kù)開(kāi)發(fā)中,可對(duì)二進(jìn)制大對(duì)象和C結(jié)構(gòu)體使用BLOB類(lèi)型數(shù)據(jù)處理。SQLite移動(dòng)數(shù)據(jù)庫(kù)的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用,它占用的資源非常低。SQLite嵌入式移動(dòng)數(shù)據(jù)庫(kù)的易用性,可加快應(yīng)用程序的開(kāi)發(fā),完全支持復(fù)雜的SQL,對(duì)于小型設(shè)備的有限空間來(lái)說(shuō)是特別重要的應(yīng)用。此外,SQL還支持原子的、一致的、獨(dú)立的和持久的(ACID)事務(wù)。SQLite允許多個(gè)進(jìn)程同時(shí)打開(kāi)一個(gè)數(shù)據(jù)庫(kù),同時(shí)讀取數(shù)據(jù)庫(kù)實(shí)現(xiàn)并發(fā)處理。隨著應(yīng)用的廣泛,在移動(dòng)數(shù)據(jù)庫(kù)中具有越來(lái)越多的圖像數(shù)據(jù)、大文本數(shù)據(jù)、音頻和視頻數(shù)據(jù),在SQLite中BLOB數(shù)據(jù)類(lèi)型的應(yīng)用將更為廣闊。 參考文獻(xiàn): [1] Michael Owens. The Definitive Guide to SQLite[M]. Berkeley: Apress, 2006. [2] 葉宏祥. 移動(dòng)存儲(chǔ)關(guān)鍵性技術(shù)的研究及進(jìn)展[J]. 移動(dòng)通信, 2009(11): 32-34. [3] The Architecture of SQLite[EB/OL]. [2013-08-21]. http://www.sqlite.org/arch.html. [4] 劉玉海,劉冰. SQLite嵌入式數(shù)據(jù)庫(kù)及圖象處理技術(shù)研究[J]. 軟件, 2012(8): 102-104. [5] C/C++ Interface for SQLite Version3[EB/OL]. [2013-08-21]. http://www.sqlite.org/capi3ref.html.★
char*sql="INSERT INTO xuch(BH,MC,SL) VALUES(‘20121001,Computer,20); "
……
char*sql="UPDATE xuch SET SB=? WHERE MC='Computer';" //‘?通配符是占位符代替二進(jìn)制文件
}
……//此處需應(yīng)有為占位符‘?所提供的圖像視頻等大對(duì)象文件的打開(kāi)等操作
sqlite3_bind_blob(stmt, 1, fl, fs, NULL);//調(diào)用該函數(shù)使Update中‘?代表的參數(shù)傳入對(duì)應(yīng)字段,其中的stmt記錄了SQL語(yǔ)句。
如果有多個(gè)‘?,就需要寫(xiě)出多個(gè)sqlite3_bind_blob語(yǔ)句,并改變它們的第2個(gè)參數(shù)即可替換到不同的‘?。最后使用sqlite3_step將二進(jìn)制數(shù)據(jù)保存到對(duì)應(yīng)的數(shù)據(jù)庫(kù)中。
(2)C結(jié)構(gòu)體類(lèi)型在BLOB中的處理技術(shù)
將一個(gè)結(jié)構(gòu)體數(shù)據(jù)以二進(jìn)制的方式寫(xiě)入到SQLite數(shù)據(jù)庫(kù)的BLOB類(lèi)型中,并顯示出結(jié)果。
Demo2.c程序主要代碼如下所示,其中personal是一個(gè)結(jié)構(gòu)體數(shù)組。
sqlite3*db;
sqlite3_open("test.db", &db);
sqlite3_stmt*stmt;
typedef struct xuchunhua
{ int no;
char name[10];
bool sex;
}teacher;
teacher personal[20];
……
personal[1].no=10;
strcpy(personal[1].name,“LiuBing”);
personal[i].bool=1;
……
result=sqlite3_exec(db,"create table xuch(bh text,jg blob)", 0,0,&perrmsg); //創(chuàng)建對(duì)應(yīng)的表,這里用到了blob類(lèi)型
result=sqlite3_prepare(db,"insert into xuch values(?,?)",-1,&stmt,0); //插入數(shù)據(jù),這里采用預(yù)編譯的形式,凡是二進(jìn)制的數(shù)據(jù)都要這樣處理[5]
……
void*buffer ; //創(chuàng)建內(nèi)存指針
buffer=new char(sizeof(teacher)); //初始化存儲(chǔ)空間,sizeof(teacher)為結(jié)構(gòu)體大小
……
result=sqlite3_bind_text(stmt,1,“X1001”, -1,NULL); //綁定表的第一個(gè)字段,這里為text類(lèi)型
result=sqlite3_bind_blob(stmt,2,buffer,sizeof(teacher),NULL); //綁定blob類(lèi)型
result=sqlite3_step(stmt); //執(zhí)行sql語(yǔ)句,這樣就把數(shù)據(jù)存到數(shù)據(jù)庫(kù)里了
……
result=sqlite3_prepare(db,"select jg from xuch
where bh=“X1001”,-1,&stmt,0); //查找一行的數(shù)據(jù)
result=sqlite3_step(stmt);
if(result==SQLITE_ROW)
{
int blob_size=sqlite3_column_bytes(stmt,0)/sizeof(teacher); //獲取數(shù)組的長(zhǎng)度
personal1=(teacher*)sqlite3_column_blob(stmt,0); //獲取數(shù)組的頭指針
for(int i=0 ;i {printf("%d",personal[i].sno); printf("%s",personal[i].sname; //輸出數(shù)據(jù) ……} } sqlite3_finalize(stmt); sqlite3_close(db); 4 結(jié)束語(yǔ) SQLite提供了存取二進(jìn)制大對(duì)象BLOB的方法,在嵌入式移動(dòng)數(shù)據(jù)庫(kù)開(kāi)發(fā)中,可對(duì)二進(jìn)制大對(duì)象和C結(jié)構(gòu)體使用BLOB類(lèi)型數(shù)據(jù)處理。SQLite移動(dòng)數(shù)據(jù)庫(kù)的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用,它占用的資源非常低。SQLite嵌入式移動(dòng)數(shù)據(jù)庫(kù)的易用性,可加快應(yīng)用程序的開(kāi)發(fā),完全支持復(fù)雜的SQL,對(duì)于小型設(shè)備的有限空間來(lái)說(shuō)是特別重要的應(yīng)用。此外,SQL還支持原子的、一致的、獨(dú)立的和持久的(ACID)事務(wù)。SQLite允許多個(gè)進(jìn)程同時(shí)打開(kāi)一個(gè)數(shù)據(jù)庫(kù),同時(shí)讀取數(shù)據(jù)庫(kù)實(shí)現(xiàn)并發(fā)處理。隨著應(yīng)用的廣泛,在移動(dòng)數(shù)據(jù)庫(kù)中具有越來(lái)越多的圖像數(shù)據(jù)、大文本數(shù)據(jù)、音頻和視頻數(shù)據(jù),在SQLite中BLOB數(shù)據(jù)類(lèi)型的應(yīng)用將更為廣闊。 參考文獻(xiàn): [1] Michael Owens. The Definitive Guide to SQLite[M]. Berkeley: Apress, 2006. [2] 葉宏祥. 移動(dòng)存儲(chǔ)關(guān)鍵性技術(shù)的研究及進(jìn)展[J]. 移動(dòng)通信, 2009(11): 32-34. [3] The Architecture of SQLite[EB/OL]. [2013-08-21]. http://www.sqlite.org/arch.html. [4] 劉玉海,劉冰. SQLite嵌入式數(shù)據(jù)庫(kù)及圖象處理技術(shù)研究[J]. 軟件, 2012(8): 102-104. [5] C/C++ Interface for SQLite Version3[EB/OL]. [2013-08-21]. http://www.sqlite.org/capi3ref.html.★