亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        SQLite移動(dòng)嵌入式數(shù)據(jù)庫(kù)BLOB類(lèi)型的應(yīng)用

        2014-08-08 08:02:54劉玉海
        移動(dòng)通信 2014年8期
        關(guān)鍵詞:嵌入式數(shù)據(jù)庫(kù)

        【摘要】在對(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ù)的有效性。

        【關(guān)鍵詞】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)-08-0061-04

        Application of BLOB Data Type in SQLite Mobile Embedded Database

        LIU Yu-hai

        (College of Mining Technology, Taiyuan University of Technology, Taiyuan 030024, China)

        [Abstract] Based on the analysis of BLOB data type in mobile embedded database, the API function of C language calls mobile SQLite database statements and connection function is called according to its access mode, which achieves BLOB method of binary large objects and C structure array in SQLite mobile database. With the increase of images as well as audio and video data, the application of BLOB data type in SQLite will be broader. Demo examples are given to verify the effectiveness of this technology.

        [Key words]SQLite mobile databaseBLOB typeembedded development

        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ǔ)效率和查詢(xún)速度的提高。

        3 BLOB類(lèi)型在SQLite中的應(yīng)用

        3.1SQLite的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)查詢(xún)函數(shù)

        int sqlite3_get_table(sqlite3*,const char*sql,char ***ret,int*nrow,int*ncol,char**em);

        功能是無(wú)需回調(diào)函數(shù)處理,直接能查詢(xún)結(jié)果集。

        3.2SQLite數(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ì)待普通的文本一樣插入或查詢(xún)那樣簡(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 ",EM);}

        endprint

        }

        //插入數(shù)據(jù)記錄并處理大對(duì)象數(shù)據(jù)函數(shù)

        int InsertRec(sqlite3*db)

        {……

        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.★

        作者簡(jiǎn)介

        劉玉海:高級(jí)工程師,現(xiàn)任職于太原理工大學(xué)礦業(yè)工程學(xué)院,主要研究方向?yàn)閿?shù)據(jù)庫(kù)及應(yīng)用系統(tǒng)開(kāi)發(fā)。

        猜你喜歡
        嵌入式數(shù)據(jù)庫(kù)
        TS系列紅外傳感器在嵌入式控制系統(tǒng)中的應(yīng)用
        電子制作(2019年7期)2019-04-25 13:17:14
        嵌入式系統(tǒng)通信技術(shù)的應(yīng)用
        電子制作(2018年18期)2018-11-14 01:48:16
        搭建基于Qt的嵌入式開(kāi)發(fā)平臺(tái)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        嵌入式軟PLC在電鍍生產(chǎn)流程控制系統(tǒng)中的應(yīng)用
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        數(shù)據(jù)庫(kù)
        Altera加入嵌入式視覺(jué)聯(lián)盟
        婷婷丁香社区| 国色天香社区视频在线| 久久香蕉国产线熟妇人妻| 久久精品中文字幕第23页| 视频精品熟女一区二区三区| 亚洲一区二区三区精品视频| 久久精品www人人爽人人| 人妻去按摩店被黑人按中出| 国产精品一区成人亚洲| 北条麻妃在线中文字幕| 99精品国产丝袜在线拍国语| 亚洲国产成人久久综合一区77| 日本人妻少妇精品视频专区| 国产午夜免费一区二区三区视频 | 欧美中文字幕在线| 精品中文字幕日本久久久| 日本免费在线不卡一区二区| 免费少妇a级毛片人成网| 精品无码av不卡一区二区三区| 一区二区三区日本在线| 日日噜噜夜夜狠狠视频 | 国产人成无码中文字幕| 国产精品国产三级厂七| 一级r片内射视频播放免费| 久久久精品456亚洲影院| 黑人巨大精品欧美在线观看| 91国内偷拍精品对白| 美女不带套日出白浆免费视频| av网站免费线看| 男女男在线精品免费观看| 五月激情综合婷婷六月久久| 国产呦系列呦交| 亚洲乱在线播放| 国产婷婷成人久久av免费| 久久超碰97人人做人人爱 | 97夜夜澡人人爽人人喊中国片| 中出高潮了中文字幕| 日韩av天堂一区二区三区在线| 帮老师解开蕾丝奶罩吸乳网站| 日日摸夜夜欧美一区二区| 精品国产日产av在线|