版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
重點(diǎn)回顧共享內(nèi)存通信獲得一段共享內(nèi)存區(qū)域:shmget函數(shù)的作用是在內(nèi)存中獲得一段共享內(nèi)存區(qū)域。映射共享內(nèi)存:使用函數(shù)shmat,它的作用是將創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間去。撤銷映射:shmdt函數(shù)用來(lái)撤銷映射。多線程編程12第5章嵌入式數(shù)據(jù)庫(kù)5.1嵌入式數(shù)據(jù)庫(kù)概述//5.2SQLite數(shù)據(jù)庫(kù)5.3mSQL數(shù)據(jù)庫(kù)//5.4BerkeleyDB數(shù)據(jù)庫(kù)//
35.1嵌入式數(shù)據(jù)庫(kù)概述5.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介5.1.2嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)及分類5.1.3嵌入式數(shù)據(jù)庫(kù)的應(yīng)用45.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介嵌入式數(shù)據(jù)庫(kù)將數(shù)據(jù)庫(kù)系統(tǒng)與操作系統(tǒng)和具體應(yīng)用集成在一起,運(yùn)行在各種智能嵌入式設(shè)備上。與傳統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)相比,它一般體積較小,有較強(qiáng)的便攜性和易用性,以及較為完備的功能來(lái)實(shí)現(xiàn)用戶對(duì)數(shù)據(jù)的管理操作。但是,由于嵌入式系統(tǒng)的資源限制,它無(wú)法作為一個(gè)完整的數(shù)據(jù)庫(kù)來(lái)提供大容量的數(shù)據(jù)管理,而且嵌入式設(shè)備可隨處放置,受環(huán)境影響較大,數(shù)據(jù)可靠性較低。55.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介在實(shí)際應(yīng)用中,為了彌補(bǔ)嵌入式數(shù)據(jù)庫(kù)存儲(chǔ)容量小、可靠性低的不足,通常在PC機(jī)上配置后臺(tái)數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)大容量數(shù)據(jù)的存儲(chǔ)和管理。嵌入式數(shù)據(jù)庫(kù)作為前端設(shè)備,需要一個(gè)GUI交互界面來(lái)實(shí)現(xiàn)嵌入式終端上的人機(jī)交互,并通過(guò)串口實(shí)現(xiàn)和PC機(jī)上主數(shù)據(jù)源之間的數(shù)據(jù)交換,實(shí)現(xiàn)系統(tǒng)服務(wù)器端數(shù)據(jù)的管理,接收嵌入式終端上傳的數(shù)據(jù)和下載數(shù)據(jù)到嵌入式終端機(jī)等操作。嵌入式數(shù)據(jù)庫(kù)的名稱來(lái)自其獨(dú)特的運(yùn)行模式。這種數(shù)據(jù)庫(kù)嵌入到了應(yīng)用程序進(jìn)程中,消除了與客戶機(jī)服務(wù)器配置相關(guān)的開(kāi)銷。6嵌入式數(shù)據(jù)庫(kù)實(shí)際上是輕量級(jí)的,在運(yùn)行時(shí),它們需要較少的內(nèi)存。它們是使用精簡(jiǎn)代碼編寫的,對(duì)于嵌入式設(shè)備,其速度更快,效果更理想。嵌入式運(yùn)行模式允許嵌入式數(shù)據(jù)庫(kù)通過(guò)SQL來(lái)輕松管理應(yīng)用程序數(shù)據(jù),而不依靠原始的文本文件。嵌入式數(shù)據(jù)庫(kù)還提供零配置運(yùn)行模式,這樣可以啟用其中一個(gè)并運(yùn)行一個(gè)快照。5.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介7在嵌入式系統(tǒng)中,對(duì)數(shù)據(jù)庫(kù)的操作具有定時(shí)限制的特性,這里把應(yīng)用于嵌入式系統(tǒng)的數(shù)據(jù)庫(kù)系統(tǒng)稱為嵌入式數(shù)據(jù)庫(kù)系統(tǒng)或嵌入式實(shí)時(shí)數(shù)據(jù)庫(kù)系統(tǒng)(ERTDBS)。嵌入式數(shù)據(jù)庫(kù)是嵌入式系統(tǒng)的重要組成部分,也成為對(duì)越來(lái)越多的個(gè)性化應(yīng)用開(kāi)發(fā)和管理而采用的一種必不可少的有效手段。5.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介8在嵌入式數(shù)據(jù)庫(kù)領(lǐng)域,各大數(shù)據(jù)庫(kù)廠商競(jìng)爭(zhēng)也日趨激烈,Oracle、IBM、Sybase、InterSystems、日立、Firefbird等均在這一領(lǐng)域有所行動(dòng)。如繼2005年并購(gòu)全球最大的內(nèi)存數(shù)據(jù)庫(kù)廠商TimesTen之后,去年,Oracle又收購(gòu)了全球下載用戶最多的嵌入式數(shù)據(jù)庫(kù)廠商Sleepycat及其BerkeleyDB產(chǎn)品,進(jìn)一步完善了嵌入式軟件的產(chǎn)品線。從Oracle自身來(lái)說(shuō),Oracle提供的不僅是一個(gè)嵌入式數(shù)據(jù)庫(kù)產(chǎn)品,更重要的是從底層提供的一種端到端的數(shù)據(jù)管理架構(gòu),并大力支持重點(diǎn)行業(yè)領(lǐng)域的關(guān)鍵合作伙伴在此架構(gòu)上開(kāi)發(fā)的相關(guān)應(yīng)用和服務(wù)。5.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介9嵌入式數(shù)據(jù)庫(kù)會(huì)跟隨信息技術(shù)以及互聯(lián)網(wǎng)的發(fā)展得到普及,嵌入式數(shù)據(jù)庫(kù)將成為工業(yè)智能化的必經(jīng)之路,未來(lái)嵌入式數(shù)據(jù)庫(kù)將有很大的發(fā)展空間。首先,專業(yè)化發(fā)展明顯。其次,嵌入式數(shù)據(jù)庫(kù)將朝標(biāo)準(zhǔn)化發(fā)展。最后,嵌入式數(shù)據(jù)庫(kù)與企業(yè)內(nèi)部信息的同步管理將得到發(fā)展。5.1.1嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介105.1.2嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)及分類1.嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)2.嵌入式數(shù)據(jù)庫(kù)的分類111.嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)嵌入性是嵌入式數(shù)據(jù)庫(kù)的基本特性。嵌入式數(shù)據(jù)庫(kù)不僅可以嵌入到其他的軟件當(dāng)中,也可以嵌入到硬件設(shè)備當(dāng)中。例如嵌入式數(shù)據(jù)庫(kù)Empress就是使數(shù)據(jù)庫(kù)以組件的形式存在,并發(fā)布給客戶,客戶只需要像調(diào)用自己定義的函數(shù)那樣調(diào)用相應(yīng)的函數(shù)就可以創(chuàng)建表、插入刪除數(shù)據(jù)等常規(guī)的數(shù)據(jù)庫(kù)操作??蛻粼谧约旱漠a(chǎn)品發(fā)布時(shí),可以將Empress數(shù)據(jù)庫(kù)編譯到自己的產(chǎn)品內(nèi),變成自己產(chǎn)品的一部分,最終用戶是感受不到數(shù)據(jù)庫(kù)的存在的,也不用特意去維護(hù)數(shù)據(jù)庫(kù)。12可靠性要求是毋庸置疑的。嵌入式系統(tǒng)必須能夠在沒(méi)有人工干預(yù)的情況下,長(zhǎng)時(shí)間不間斷地運(yùn)行。同時(shí)要求數(shù)據(jù)庫(kù)操作具備可預(yù)知性,而且系統(tǒng)的大小和性能也都必須是可預(yù)知的,這樣才能保證系統(tǒng)的性能。嵌入式系統(tǒng)中會(huì)不可避免地與底層硬件打交道,因此在數(shù)據(jù)管理時(shí),也要有底層控制的能力,如什么時(shí)候會(huì)發(fā)生磁盤操作,磁盤操作的次數(shù),如何控制等。底層控制的能力是決定數(shù)據(jù)庫(kù)管理操作的關(guān)鍵。1.嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)13實(shí)時(shí)性和嵌入性是分不開(kāi)的。只有具有了嵌入性的數(shù)據(jù)庫(kù)才能夠第一時(shí)間得到系統(tǒng)的資源,對(duì)系統(tǒng)的請(qǐng)求在第一時(shí)間內(nèi)做出響應(yīng)。但是,并不是具有嵌入性就一定具有實(shí)時(shí)性。要想嵌入式數(shù)據(jù)庫(kù)具有很好的實(shí)時(shí)性,必須做很多額外的工作。比如:Empress實(shí)時(shí)數(shù)據(jù)庫(kù)將嵌入性和高速的數(shù)據(jù)引擎、定時(shí)功能以及防斷片處理等措施整合在一起來(lái)保證最基本的實(shí)時(shí)性。當(dāng)然,不同的場(chǎng)合實(shí)時(shí)性要求比較高時(shí),除了軟件的實(shí)時(shí)性外,硬件的實(shí)時(shí)性也是必須的,具體情況需要有具體和切實(shí)的解決方案,不能一概而論。1.嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)14移動(dòng)性是目前在國(guó)內(nèi)提的比較多的一個(gè)說(shuō)法,這和目前國(guó)內(nèi)移動(dòng)設(shè)備的大規(guī)模應(yīng)用有關(guān)。可以這么說(shuō),具有嵌入性的數(shù)據(jù)庫(kù)一定具有比較好的移動(dòng)性,但是具有比較好的移動(dòng)性的數(shù)據(jù)庫(kù),不一定具有嵌入性。比如,一個(gè)小型的C/S結(jié)構(gòu)的數(shù)據(jù)庫(kù)也可以運(yùn)用在移動(dòng)設(shè)備上,而具有移動(dòng)性。但這個(gè)數(shù)據(jù)庫(kù)本身是一個(gè)獨(dú)立存在的實(shí)體,需要額外的運(yùn)行資源,本質(zhì)上講和企業(yè)級(jí)數(shù)據(jù)庫(kù)區(qū)別不大。所以不具有嵌入性,也基本上不具備實(shí)時(shí)性。Empress是優(yōu)秀的嵌入式實(shí)時(shí)數(shù)據(jù)庫(kù),毫無(wú)疑問(wèn)也是非常優(yōu)秀的移動(dòng)數(shù)據(jù)庫(kù)。1.嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)15可定制性在嵌入式場(chǎng)合顯得尤為重要。首先嵌入式場(chǎng)合硬件和軟件的平臺(tái)都是千差萬(wàn)別,基本都是客戶根據(jù)需要自己選擇的結(jié)果。所以嵌入式場(chǎng)合的數(shù)據(jù)庫(kù)必須能夠支持非常多的平臺(tái),如Empress目前支持6000多種平臺(tái)。同時(shí),數(shù)據(jù)存儲(chǔ)要支持常見(jiàn)的存儲(chǔ)設(shè)備,如CF/Flash/HD等。多進(jìn)程和多線程是必備的,現(xiàn)在的嵌入式系統(tǒng)已經(jīng)遠(yuǎn)遠(yuǎn)不是當(dāng)初的簡(jiǎn)單的編程,代碼量增大,功能日益復(fù)雜,所以必然要支持多線程和多進(jìn)程。C/C++和SQL接口的支持也是必備的,作為數(shù)據(jù)庫(kù)當(dāng)然要有大家熟悉的SQL,但同時(shí)不要忘記嵌入式場(chǎng)合用的最多的標(biāo)準(zhǔn)的C/C++接口。1.嵌入式數(shù)據(jù)庫(kù)的特點(diǎn)162.嵌入式數(shù)據(jù)庫(kù)的分類可以按照嵌入的對(duì)象不同分為:軟件嵌入數(shù)據(jù)庫(kù)、設(shè)備嵌入數(shù)據(jù)庫(kù)、內(nèi)存數(shù)據(jù)庫(kù)。也有人將它們粗略的分為:嵌入數(shù)據(jù)庫(kù)、移動(dòng)數(shù)據(jù)庫(kù)、小型的C/S結(jié)構(gòu)數(shù)據(jù)庫(kù)等。小型C/S數(shù)據(jù)庫(kù)。這種數(shù)據(jù)庫(kù)其實(shí)是企業(yè)級(jí)數(shù)據(jù)庫(kù)的一個(gè)縮小版,縮小以后可以在一些實(shí)時(shí)性要求不高的設(shè)備內(nèi)運(yùn)行。它只和操作系統(tǒng)有關(guān),一般只能支持一些常見(jiàn)的移動(dòng)操作系統(tǒng),如,Linux和WindowsCE系列。17面向軟件嵌入數(shù)據(jù)庫(kù)。它將數(shù)據(jù)庫(kù)作為組件嵌入到其他的軟件系統(tǒng)中。一般用在對(duì)數(shù)據(jù)庫(kù)的安全性、穩(wěn)定性和速度要求比較高的系統(tǒng)中。這種結(jié)構(gòu)資源消耗低,最終用戶不用維護(hù)數(shù)據(jù)庫(kù),甚至感受不到數(shù)據(jù)的存在。面向設(shè)備嵌入數(shù)據(jù)庫(kù)。它將關(guān)系型數(shù)據(jù)庫(kù)嵌入到設(shè)備當(dāng)中去,作為設(shè)備數(shù)據(jù)處理的核心組件。這種場(chǎng)合要求數(shù)據(jù)庫(kù)有很高的實(shí)時(shí)性和穩(wěn)定性,一般運(yùn)行在實(shí)時(shí)性非常高的操作系統(tǒng)當(dāng)中。為了達(dá)到這些要求有的廠商采用關(guān)系型的數(shù)據(jù)結(jié)構(gòu),有的采用非關(guān)系型的數(shù)據(jù)結(jié)構(gòu)。有時(shí)候甚至直接和硬件打交道。當(dāng)然,這種結(jié)構(gòu)在實(shí)時(shí)性要求不高的移動(dòng)場(chǎng)合更能夠勝任。內(nèi)存數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)直接在內(nèi)存內(nèi)運(yùn)行,數(shù)據(jù)處理更加高速,不過(guò)安全性等方面需要額外的手段來(lái)保障。2.嵌入式數(shù)據(jù)庫(kù)的分類185.1.3嵌入式數(shù)據(jù)庫(kù)的應(yīng)用1.醫(yī)療領(lǐng)域北美和歐洲的一些著名的廠商利用嵌入式數(shù)據(jù)庫(kù)開(kāi)發(fā)過(guò)完整的電子病歷系統(tǒng),同時(shí)將數(shù)據(jù)庫(kù)嵌入到醫(yī)療器械當(dāng)中。如,血液分析裝置、乳癌的檢測(cè)裝置、醫(yī)學(xué)圖像裝置等。2.軍事設(shè)備和系統(tǒng)一些著名的軍事機(jī)構(gòu)和全球著名的武器生產(chǎn)商將嵌入式數(shù)據(jù)庫(kù)運(yùn)用到他們的系統(tǒng)控制裝置、戰(zhàn)士武器、軍艦裝置、火箭和導(dǎo)彈裝置中。這些場(chǎng)合用的數(shù)據(jù)庫(kù)有很多的安全設(shè)定和特化設(shè)定,基本上嚴(yán)格按照每個(gè)客戶的技術(shù)標(biāo)準(zhǔn)的要求來(lái)特化引擎級(jí)構(gòu)件。具體的應(yīng)用級(jí)的構(gòu)件由客戶自己完成。193.地理信息系統(tǒng)地理信息包括的范圍很廣,在國(guó)外地理信息系統(tǒng)已經(jīng)發(fā)展了很多年,國(guó)內(nèi)這幾年也逐漸加大對(duì)地理信息系統(tǒng)方面的投入。嵌入式數(shù)據(jù)庫(kù)在地理信息系統(tǒng)方面的應(yīng)用非常廣泛。如,空間數(shù)據(jù)分析系統(tǒng)、衛(wèi)星天氣數(shù)據(jù)、龍卷風(fēng)和颶風(fēng)監(jiān)控及預(yù)測(cè)等等。幾乎涉及到地理信息的方方面面。4.工業(yè)控制工業(yè)控制的一個(gè)基本方式是一個(gè)反饋的閉環(huán)或半閉環(huán)的控制方式。隨著工業(yè)控制技術(shù)的發(fā)展,簡(jiǎn)單的數(shù)據(jù)采集方式和反饋方式基本上很難滿足要求。采用嵌入式數(shù)據(jù)庫(kù)即能夠進(jìn)行高速的數(shù)據(jù)采集,也能夠快速的反饋。5.1.3嵌入式數(shù)據(jù)庫(kù)的應(yīng)用205.網(wǎng)絡(luò)通訊隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡(luò)越來(lái)越普及,網(wǎng)絡(luò)設(shè)備的處理能力越來(lái)越強(qiáng)、各種要求也越來(lái)越高,運(yùn)用嵌入式數(shù)據(jù)庫(kù)也成了必然趨勢(shì)。我們現(xiàn)在日常見(jiàn)到的很多網(wǎng)絡(luò)設(shè)備和系統(tǒng)都已經(jīng)使用了嵌入式數(shù)據(jù)庫(kù)。6.空間探索一些全球著名的機(jī)構(gòu)將嵌入式數(shù)據(jù)庫(kù)用在一些著名的空間探索裝置中,如大家熟知的一些太陽(yáng)系內(nèi)行星的探測(cè)器等。5.1.3嵌入式數(shù)據(jù)庫(kù)的應(yīng)用217.消費(fèi)類電子目前在中國(guó)消費(fèi)類電子比較火熱,它包含的范圍也非常廣。如:個(gè)人消費(fèi)相關(guān)的PND、移動(dòng)電話、PDA、SmartPhone、數(shù)碼產(chǎn)品等;信息家電和智能辦公相關(guān)的機(jī)頂盒、家用多媒體盒、互聯(lián)網(wǎng)電視接收裝置、打印機(jī)、一體機(jī)等;還有汽車電子等。5.1.3嵌入式數(shù)據(jù)庫(kù)的應(yīng)用225.2SQLite數(shù)據(jù)庫(kù)5.2.1SQLite數(shù)據(jù)庫(kù)概述5.2.2SQLite數(shù)據(jù)庫(kù)的安裝5.2.3SQLite數(shù)據(jù)庫(kù)基本命令5.2.4SQLite數(shù)據(jù)庫(kù)管理命令5.2.5SQLite的API函數(shù)5.2.6SQLite實(shí)例分析235.2.1SQLite數(shù)據(jù)庫(kù)概述1.概述2.SQLite組件3.數(shù)據(jù)類型241.概述
SQLite是D.RichardHipp用C語(yǔ)言編寫的開(kāi)源嵌入式數(shù)據(jù)庫(kù)引擎。發(fā)布于2000年5月。它是完全獨(dú)立的,不具有外部依賴性。SQLite支持多數(shù)SQL92標(biāo)準(zhǔn),可以在所有主要的操作系統(tǒng)上運(yùn)行。其創(chuàng)建者保守地估計(jì)SQLite可以處理每天負(fù)擔(dān)多達(dá)100,00次點(diǎn)擊率的Web站點(diǎn),并且SQLite有時(shí)候可以處理10倍于上述數(shù)字的負(fù)載。5.2.1SQLite數(shù)據(jù)庫(kù)概述25SQLite對(duì)SQL92標(biāo)準(zhǔn)的支持包括索引、限制、觸發(fā)和查看。SQLite不支持外鍵限制,但支持原子的、一致的、獨(dú)立和持久(ACID)的事務(wù)(后面會(huì)提供有關(guān)ACID的更多信息)。SQLite通過(guò)數(shù)據(jù)庫(kù)級(jí)上的獨(dú)占性和共享鎖定來(lái)實(shí)現(xiàn)獨(dú)立事務(wù)處理。這意味著當(dāng)多個(gè)進(jìn)程和線程可以在同一時(shí)間從同一數(shù)據(jù)庫(kù)讀取數(shù)據(jù),但只有一個(gè)可以寫入數(shù)據(jù)。在某個(gè)進(jìn)程或線程向數(shù)據(jù)庫(kù)執(zhí)行寫入操作之前,必須獲得獨(dú)占鎖定。在發(fā)出獨(dú)占鎖定后,其他的讀或?qū)懖僮鲗⒉粫?huì)再發(fā)生。5.2.1SQLite數(shù)據(jù)庫(kù)概述262.SQLite組件
SQLite由以下幾個(gè)組件組成:SQL編譯器、內(nèi)核、后端以及附件SQLite通過(guò)利用虛擬機(jī)和虛擬數(shù)據(jù)庫(kù)引擎(VDBE),使調(diào)試、修改和擴(kuò)展SQLite的內(nèi)核變得更加方便。所有SQL語(yǔ)句都被編譯成易讀的、可以在SQLite虛擬機(jī)中執(zhí)行的程序集。5.2.1SQLite數(shù)據(jù)庫(kù)概述275.2.1SQLite數(shù)據(jù)庫(kù)概述3.數(shù)據(jù)類型SQLite不支持靜態(tài)數(shù)據(jù)類型,而是使用列關(guān)系。這意味著它的數(shù)據(jù)類型不具有表列屬性,而具有數(shù)據(jù)本身的屬性。當(dāng)某個(gè)值插入數(shù)據(jù)庫(kù)時(shí),SQLite將檢查它的類型。如果該類型與關(guān)聯(lián)的列不匹配,則SQLite會(huì)嘗試將該值轉(zhuǎn)換成列類型。如果不能轉(zhuǎn)換,則該值將作為其本身具有的類型存儲(chǔ)。SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數(shù)據(jù)類型。285.2.2SQLite數(shù)據(jù)庫(kù)的安裝sqlite是一個(gè)面向嵌入式系統(tǒng)的數(shù)據(jù)庫(kù),編譯完成只有200K,同時(shí)支持2T的數(shù)據(jù)記錄。對(duì)于嵌入式設(shè)備是一個(gè)很好的數(shù)據(jù)庫(kù)引擎。SQLite是源碼開(kāi)放,可以直接到網(wǎng)上免費(fèi)下載源碼包,其下載地址為:/download.html。這里我們下載到了這個(gè)版本,我們使用的操作系統(tǒng)是ubuntu10,依照Readme中的步驟,其安裝過(guò)程如下:1.本地安裝把下載到的壓縮包拷貝到root目錄下,然后運(yùn)行解壓壓縮包命令,在當(dāng)前目錄會(huì)生成一個(gè)sqlite-autoconf-3071502的子目錄,所有的源代碼都存放到了該目錄中,進(jìn)入到該目錄進(jìn)行配置,配置完后會(huì)在當(dāng)前目錄下生成Makefile文件。29接下來(lái)編譯并安裝,其命令如下:使用GNU的AUTOCONF和AUTOMAKE產(chǎn)生的程序的安裝步驟如下:[root@JLUZH~]#tar-zxvfsqlite-autoconf-3071502.tar.gz[root@JLUZH~]#cdsqlite-autoconf-30715025.2.2SQLite數(shù)據(jù)庫(kù)的安裝【常用參數(shù)】:tar常用參數(shù)如下:-x解開(kāi)一個(gè)打包文件的參數(shù)指令-f指定打包后的文件名,注意:在f之后不能有其他參數(shù)-z調(diào)用gzip來(lái)壓縮或解壓打包文件-v執(zhí)行時(shí)顯示詳細(xì)的信息30./configure是用來(lái)檢測(cè)你的安裝平臺(tái)的目標(biāo)特征的。比如它會(huì)檢測(cè)你是不是有CC或GCC,并不是需要CC或GCC,它是個(gè)shell腳本make是用來(lái)編譯的,它從Makefile中讀取指令,然后編譯。makeinstall是用來(lái)安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
[root@JLUZH~/sqlite-autoconf-3071502]#./configure[root@JLUZH~/sqlite-autoconf-3071502]#make[root@JLUZH~/sqlite-autoconf-3071502]#makeinstall
5.2.2SQLite數(shù)據(jù)庫(kù)的安裝31在make和makeinstall之后,庫(kù)文件編譯并安裝在/usr/local/lib目錄下,可執(zhí)行文件sqlite3安裝在/usr/local/bin目錄下,頭文件安裝在/usr/local/include目錄下。在鏈接程序時(shí),為了能夠找到庫(kù)文件,需要把庫(kù)文件所在路徑加到系統(tǒng)文件/etc/ld.so.conf中,如圖
在文件后面追加/usr/local/lib一行內(nèi)容。保存文件并退出,重新啟動(dòng)系統(tǒng)之后,設(shè)置生效,如果不想重新啟動(dòng)系統(tǒng),可運(yùn)行如下命令:[root@JLUZH~]#/sbin/ldconfig
5.2.2SQLite數(shù)據(jù)庫(kù)的安裝32為了驗(yàn)證安裝是否成功,在shell下運(yùn)行sqlite3命令創(chuàng)建一個(gè)數(shù)據(jù)庫(kù),并測(cè)試數(shù)據(jù)庫(kù),其命令如下:
[root@JLUZHbin]#sqlite3SQLiteversion3.6.20Enter".help"forinstructionsEnterSQLstatementsterminatedwitha";"sqlite>5.2.2SQLite數(shù)據(jù)庫(kù)的安裝332.交叉編譯與安裝如果要把SQLite3運(yùn)行在嵌入式體系上,則需要對(duì)SQLite3進(jìn)行交叉編譯。以編譯在ARM體系運(yùn)行的SQLite3為例,基本操作步驟和前面一致,只是更改了配置信息。--disabel-tcl參數(shù)表示屏蔽掉tcl庫(kù);-prefix參數(shù)指定安裝的路徑,在這里/usr/local為指定的安裝bin、lib、include路徑;--host參數(shù)指定交叉編譯器。這里armv4l-unknown-linux為交叉編譯器。需要指出的是,該交叉編譯器需要提前安裝好,并且交叉編譯器的路徑已經(jīng)加入到環(huán)境變量中。配置完后,編譯安裝的步驟和本地安裝一致。[root@JLUZHsqlite-3.6.20]#./configure–disable–tcl–host=armv4l-unknown-linux–prefix=/usr/local
5.2.2SQLite數(shù)據(jù)庫(kù)的安裝345.2.3SQLite數(shù)據(jù)庫(kù)基本命令便于學(xué)習(xí),我們結(jié)合實(shí)例來(lái)說(shuō)明命令的使用,假設(shè)我們要設(shè)計(jì)一個(gè)個(gè)人信息管理系統(tǒng)。首先我們根據(jù)需求來(lái)設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù),命名為test.db,在個(gè)人信息管理系統(tǒng)中我們主要是要實(shí)現(xiàn)對(duì)某個(gè)人的信息進(jìn)行增加、刪除、修改、查詢等操作,而個(gè)人信息主要包括姓名、性別和電話,我們創(chuàng)建一個(gè)people的數(shù)據(jù)表,這樣就可以起到一個(gè)通訊錄的作用,用戶也可以根據(jù)別的需求增加其他字段。另外,在數(shù)據(jù)庫(kù)的表中應(yīng)該有一個(gè)主鍵,由于名字可能發(fā)生重名,所以不能作為主鍵,所以我們將增加ID字段來(lái)作為主鍵。35people數(shù)據(jù)表的結(jié)構(gòu)如表5-1所示。5.2.3SQLite數(shù)據(jù)庫(kù)基本命令36用sqlite3建立數(shù)據(jù)庫(kù)的方法很簡(jiǎn)單,啟動(dòng)終端,只需輸入如下命令:[root@JLUZHsqlite-3.6.20]#sqlite3test.dbSQLiteversion3.6.20Enter".help"forinstructionsEnterSQLstatementsterminatedwitha";"(1)建立數(shù)據(jù)庫(kù)37createtable指令的語(yǔ)法為:createtabletable_name(field1,field2,field3,...);table_name是數(shù)據(jù)表的名稱,fieldx則是字段的名字。sqlite3與許多SQL數(shù)據(jù)庫(kù)軟件不同的是,它不在乎字段屬于哪一種數(shù)據(jù)型態(tài),sqlite3的字段可以儲(chǔ)存任何類型:文字、數(shù)字、大量文字(blub),它會(huì)在適時(shí)自動(dòng)轉(zhuǎn)換。假設(shè)我們要建一個(gè)名叫people的數(shù)據(jù)表,只要鍵入以下指令就可以了:CREATETABLEpeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18));執(zhí)行以上命令建立了一個(gè)名叫people的數(shù)據(jù)表,里面有ID、name、age、num四個(gè)字段。(2)建立表38如果數(shù)據(jù)表有相當(dāng)多的數(shù)據(jù),我們便會(huì)建立索引來(lái)加快速度。這個(gè)指令的語(yǔ)法為:createindexindex_nameontable_name(field_to_be_indexed);針對(duì)上面的數(shù)據(jù)表people建立一個(gè)索引,則可以使用如下命令:createindexpeople_name_indexonpeople(name);意思是針對(duì)people數(shù)據(jù)表的name字段,建立一個(gè)名叫people_name_index的索引。一旦建立了索引,sqlite3會(huì)在針對(duì)該字段作查詢時(shí),自動(dòng)使用該索引。這一切的操作都是在幕后自動(dòng)發(fā)生的,無(wú)須使用者特別指令。(3)建立索引39接下來(lái)我們要加入記錄了,加入的方法為使用insertinto指令,語(yǔ)法為:insertintotable_namevalues(data1,data2,data3,...);例如在people數(shù)據(jù)表中,我們使用如下命令加入記錄:insertintopeopleVALUES(1,'LiMing',20,);insertintopeopleVALUES(2,'LiSi',21,);insertintopeopleVALUES(3,'WangWu',20,);(4)插入記錄40(5)查詢記錄查詢記錄的命令為select,其基本格式如下:selectcolumnsfromtable_namewhereexpression;以下是select命令的一些例子:select*frompeople;當(dāng)然是列出所有數(shù)據(jù)庫(kù)的內(nèi)容select*frompeoplewherename='LiSi';查找姓名為L(zhǎng)iSi的記錄select指令是SQL中最強(qiáng)大的指令,這里只是簡(jiǎn)單介紹select的基本用法,進(jìn)一步的各種組合,請(qǐng)大家參考有關(guān)數(shù)據(jù)庫(kù)的書籍41(6)修改或刪除記錄掌握select語(yǔ)句的用法非常重要,因?yàn)橐趕qlite中更改或刪除記錄,其語(yǔ)法是類似的。修改記錄的命令為update,刪除記錄的命令為delete,其使用如下:updatepeoplesetname='Lisi'wherename='LiSi';修改姓名為L(zhǎng)iSi的記錄deletefrompeoplewherename='Lisi';刪除姓名為L(zhǎng)isi的記錄
425.2.4SQLite數(shù)據(jù)庫(kù)管理命令在終端輸入sqlite3命令啟動(dòng)數(shù)據(jù)庫(kù)系統(tǒng)后,就會(huì)出現(xiàn)sqlite->提示符,在提示符下輸入命令即可操作SQLite3數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)的管理可以使用命令行方式,也可以使用圖形化方式進(jìn)行管理。1.命令行方式管理命令(1)Help命令啟動(dòng)sqlite數(shù)據(jù)管理系統(tǒng)后,出現(xiàn)提示符sqlite->,則可以輸入數(shù)據(jù)庫(kù)管理命令了,注意命令之前必須用“.”開(kāi)頭,比如help命令的執(zhí)行如下:43sqlite>.help.backup?DB?FILEBackupDB(default"main")toFILE.bailON|OFFStopafterhittinganerror.DefaultOFF.databasesListnamesandfilesofattacheddatabases.dump?TABLE?...DumpthedatabaseinanSQLtextformatIfTABLEspecified,onlydumptablesmatchingLIKEpatternTABLE.…
(1)Help命令44Database命令用于查看當(dāng)前的數(shù)據(jù)庫(kù),其命令格式如下:sqlite>.databaseseqnamefile--------------------------------------------------------------0main/root/sqlite/test.db1temp輸入.database命令后,即可按順序顯示當(dāng)前的數(shù)據(jù)庫(kù),并且顯示對(duì)應(yīng)數(shù)據(jù)庫(kù)的文件,這里是/root/sqlite/test.db文件。(2)Database命令45Tables命令用于查看當(dāng)前數(shù)據(jù)庫(kù)中有多少個(gè)數(shù)據(jù)表,其命令格式如下:qlite>.tablespeople輸入.tables命令后,可以看出,在這個(gè)數(shù)據(jù)庫(kù)中存在一個(gè)people的數(shù)據(jù)表。(3)Tables命令46Schema命令用于查看數(shù)據(jù)表的結(jié)構(gòu),其命令格式如下:sqlite>.schemapeopleCREATETABLEpeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18));
輸入.schemapeople命令后,即可顯示people數(shù)據(jù)表的結(jié)構(gòu)。(4)Schema命令47Output命令用于把查詢的結(jié)果輸出到文件,其使用格式如下:sqlite>.outputwen.txtsqlite>select*frompeople;sqlite>.exit退出后,即可在當(dāng)前目錄下找到wen.txt文件,然后使用cat命令顯示其內(nèi)容,其操作如下:
[root@JLUZHsqlite]#catwen.txt1|LiMing|20|3623021989010102142|LiSi|21|3623021990050102543|WangWu|205)Output命令48使用.dump命令可以輸出表結(jié)構(gòu),同時(shí)輸出操作記錄。這樣可以創(chuàng)建一個(gè)包含必要命令和數(shù)據(jù)的文件,從而重新創(chuàng)建數(shù)據(jù)庫(kù)。.dump命令也可以用于備份數(shù)據(jù)庫(kù)表,其操作格式如下。sqlite>.dumpPRAGMAforeign_keys=OFF;BEGINTRANSACTION;CREATETABLEpeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18));INSERTINTO"people"VALUES(1,'LiMing',20,);INSERTINTO"people"VALUES(2,'LiSi',21,);INSERTINTO"people"VALUES(3,'WangWu',20,);COMMIT;(6)Dump命令49(7)quit/exit這兩個(gè)命令用于退出sqlite數(shù)據(jù)庫(kù)系統(tǒng),其操作如下:sqlite>.quit[root@JLUZHsqlite]#50管理SQLite數(shù)據(jù)庫(kù)除命令行外,網(wǎng)絡(luò)上還有很多開(kāi)源的可視化的SQLite數(shù)據(jù)庫(kù)管理工具,登陸/或者通過(guò)其他搜索引擎(GOOOGLE/BAIDU),輸入“SQLite”可以找到一大片相關(guān)工具,比如,SQLite
Database
Browser、SQLite
Administrator...
等等。這里推薦SQLite
Administrator工具,該工具界面支持簡(jiǎn)體中文、界面比較簡(jiǎn)潔、數(shù)據(jù)庫(kù)相關(guān)管理操作相對(duì)比較簡(jiǎn)便,該工具可以登陸http://sqliteadmin.orbmu2k.de/下載,其操作界面如圖5-3所示2.圖形化管理工具512.圖形化管理工具52重點(diǎn)回顧嵌入式數(shù)據(jù)庫(kù)簡(jiǎn)介SQLite數(shù)據(jù)庫(kù)SQLite數(shù)據(jù)庫(kù)基本命令:建立數(shù)據(jù)庫(kù)、建立表、建立索引、插入記錄、查詢記錄、修改和刪除記錄SQLite數(shù)據(jù)庫(kù)管理命令:Help、Database、Tables、Schema、Output、Dump、quit/exit535.2.5SQLite的API函數(shù)1.打開(kāi)數(shù)據(jù)庫(kù)打開(kāi)數(shù)據(jù)庫(kù)的函數(shù)格式如下:intsqlite3_open(constchar*filename,/*數(shù)據(jù)庫(kù)名稱*/sqlite3**ppDb/*輸出參數(shù),SQLite數(shù)據(jù)庫(kù)句柄*/);該函數(shù)用來(lái)打開(kāi)或創(chuàng)建一個(gè)SQLite3數(shù)據(jù)庫(kù)。如果在包含該函數(shù)的文件所在的路徑下有同名的數(shù)據(jù)庫(kù)(*.db),則打開(kāi)數(shù)據(jù)庫(kù),如果不存在數(shù)據(jù)庫(kù),則創(chuàng)建一個(gè)同名的數(shù)據(jù)庫(kù)在該路徑下。如果打開(kāi)或創(chuàng)建數(shù)據(jù)庫(kù)成功,則該函數(shù)返回0,輸出參數(shù)為sqlite3類型的變量,后續(xù)對(duì)該數(shù)據(jù)庫(kù)的操作,通過(guò)該參數(shù)進(jìn)行傳遞。54關(guān)閉數(shù)據(jù)庫(kù)的函數(shù)格式如下: intsqlite3_close(sqlite3*db);當(dāng)結(jié)束對(duì)數(shù)據(jù)庫(kù)的操作時(shí),調(diào)用該函數(shù)來(lái)實(shí)現(xiàn)關(guān)閉數(shù)據(jù)庫(kù),該函數(shù)的一個(gè)參數(shù)是成功打開(kāi)數(shù)據(jù)庫(kù)時(shí)的輸出參數(shù)----sqlite3類型的變量。2.關(guān)閉數(shù)據(jù)庫(kù)55intsqlite3_exec(sqlite3*,/*打開(kāi)的數(shù)據(jù)庫(kù)名稱*/constchar*sql,/*要執(zhí)行的SQL語(yǔ)句*/sqlite_callback,/*回調(diào)函數(shù)*/void*,/*回調(diào)函數(shù)的參數(shù)*/char**errmsg/*錯(cuò)誤信息*/);實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作時(shí),可以通過(guò)調(diào)用該函數(shù)來(lái)完成,sql參數(shù)為具體操作數(shù)據(jù)庫(kù)的SQL語(yǔ)句。在執(zhí)行過(guò)程中,如果出現(xiàn)錯(cuò)誤,相應(yīng)錯(cuò)誤信息可以存放在errmsg變量中。3.執(zhí)行函數(shù)56釋放內(nèi)存函數(shù)的格式如下:voidsqlite3_free(char*z);在對(duì)數(shù)據(jù)庫(kù)操作時(shí),如果需要釋放在中間過(guò)程中保存在內(nèi)存的數(shù)據(jù),可以通過(guò)該函數(shù)來(lái)清除內(nèi)存空間。4.釋放內(nèi)存函數(shù)57顯示錯(cuò)誤信息函數(shù)的格式如下:constchar*sqlite3_errmsg(sqlite3*)通過(guò)API函數(shù)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)操作的過(guò)程中,出現(xiàn)的錯(cuò)誤信息可以通過(guò)該函數(shù)給出。5.顯示錯(cuò)誤信息58獲取結(jié)果集函數(shù)的格式如下:intsqlite3_get_table(sqlite3*,/*打開(kāi)的數(shù)據(jù)庫(kù)名稱*/constchar*sql,/*要執(zhí)行的SQL語(yǔ)句*/char***resultp,/*結(jié)果集*/int*nrow,/*結(jié)果集的行數(shù)*/int*ncolumn,/*結(jié)果集的列數(shù)*/char**errmsg/*錯(cuò)誤信息*/);對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢操作時(shí),可以通過(guò)該函數(shù)來(lái)獲取結(jié)果集。該函數(shù)的入口參數(shù)為查詢的SQL語(yǔ)句,出口參數(shù)有二維數(shù)據(jù)指針,指示查詢結(jié)果的內(nèi)容,還有結(jié)果集的行數(shù)和列數(shù),這里面的行數(shù)為純記錄的條數(shù),但是resultp數(shù)組里包含一行字段名的值。6.獲取結(jié)果集59釋放結(jié)果集函數(shù)格式如下:intsqlite3_free_table(char**result);釋放sqlite3_get_table()函數(shù)所分配的內(nèi)存空間。7.釋放結(jié)果集60聲明SQL語(yǔ)句的函數(shù)格式如下:intsqlite3_prepare(sqlite3*,constchar*,int,sqlite3_stmt**,constchar**);該接口把一條SQL語(yǔ)句編譯成字節(jié)碼留給后面的執(zhí)行函數(shù),使用該接口訪問(wèn)數(shù)據(jù)庫(kù)是當(dāng)前比較好的一種方法。8.聲明SQL語(yǔ)句61銷毀一個(gè)準(zhǔn)備好的SQL聲明的函數(shù)格式如下:intsqlite3_finalize(sqlite3_stmt*);該函數(shù)將銷毀一個(gè)準(zhǔn)備好的SQL聲明,在數(shù)據(jù)庫(kù)關(guān)閉之前,所有準(zhǔn)備好的聲明都必須被釋放銷毀。9.銷毀SQL聲明62重置SQL聲明的函數(shù)格式如下:intsqlite3_reset(sqlite3_stmt*);函數(shù)用來(lái)重置一個(gè)SQL聲明的狀態(tài),使得它可以被再次執(zhí)行。10.重置SQL聲明635.2.6SQLite實(shí)例分析本節(jié)通過(guò)一個(gè)小例子說(shuō)明如何在C與C++調(diào)用SqliteAPI完成數(shù)據(jù)庫(kù)的創(chuàng)建、插入數(shù)據(jù)與查詢數(shù)據(jù)。本節(jié)用的數(shù)據(jù)庫(kù)為上節(jié)建立的test.db,本文的開(kāi)發(fā)環(huán)境為ubuntu,程序的代碼如下:645.2.6SQLite實(shí)例分析#include<stdio.h> /***sqlite.c*5-2-6**/#include<sqlite3.h>intmain(){ sqlite3*db=NULL; intrc;introw,col; char*Errormsg;
char**Result; inti=0,j=0;
rc=sqlite3_open("test.db",&db)65
if(rc){fprintf(stderr,"cant,topen:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return1; } elseprintf("opensuccessly!\n"); char*sql="createtablepeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18))"; sqlite3_exec(db,sql,0,0,&Errormsg);5.2.6SQLite實(shí)例分析66 sql="insertintopeoplevalues(1,'LiMing',20,)"; sqlite3_exec(db,sql,0,0,&Errormsg); sql="insertintopeoplevalues(2,'LiSi',21,)"; sqlite3_exec(db,sql,0,0,&Errormsg); sql="insertintopeoplevalues(3,'WanWu',20,)"; sqlite3_exec(db,sql,0,0,&Errormsg); sql="select*frompeople";5.2.6SQLite實(shí)例分析67 sqlite3_get_table(db,sql,&Resu
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年房地產(chǎn)經(jīng)紀(jì)協(xié)理之房地產(chǎn)經(jīng)紀(jì)操作實(shí)務(wù)考試題庫(kù)附答案(培優(yōu))
- 2026年一級(jí)建造師之一建民航機(jī)場(chǎng)工程實(shí)務(wù)考試題庫(kù)300道及參考答案(精練)
- 2026年勞務(wù)員考試題庫(kù)及答案【名師系列】
- 2026年勞務(wù)員之勞務(wù)員基礎(chǔ)知識(shí)考試題庫(kù)200道附完整答案(奪冠系列)
- 2026年投資項(xiàng)目管理師之投資建設(shè)項(xiàng)目實(shí)施考試題庫(kù)200道含答案(新)
- 2026年初級(jí)經(jīng)濟(jì)師之初級(jí)經(jīng)濟(jì)師財(cái)政稅收考試題庫(kù)300道附答案【鞏固】
- 2026年質(zhì)量員之設(shè)備安裝質(zhì)量專業(yè)管理實(shí)務(wù)考試題庫(kù)及參考答案【綜合題】
- 2026年設(shè)備監(jiān)理師之設(shè)備監(jiān)理合同考試題庫(kù)(預(yù)熱題)
- 2026年材料員考試備考題庫(kù)含答案【鞏固】
- 2026年一級(jí)注冊(cè)建筑師之建筑材料與構(gòu)造考試題庫(kù)500道附參考答案【預(yù)熱題】
- 《《家庭、私有制和國(guó)家的起源》導(dǎo)讀》課件
- 《水利水電工程水平定向鉆探規(guī)程》
- 低溫燙傷預(yù)防
- 2024-2025學(xué)年廣東省深圳實(shí)驗(yàn)學(xué)校初中部九年級(jí)上學(xué)期開(kāi)學(xué)考英語(yǔ)試題及答案
- 【MOOC】行為金融學(xué)-中央財(cái)經(jīng)大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 電路分析與應(yīng)用知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋吉林電子信息職業(yè)技術(shù)學(xué)院
- 管理經(jīng)濟(jì)學(xué):理論與案例 毛蘊(yùn)詩(shī)第2版 每章習(xí)題答案
- (高清版)WST 415-2024 無(wú)室間質(zhì)量評(píng)價(jià)時(shí)的臨床檢驗(yàn)質(zhì)量評(píng)價(jià)
- 國(guó)開(kāi)(河北)2024年《中外政治思想史》形成性考核1-4答案
- MOOC 微型計(jì)算機(jī)原理與接口技術(shù)-南京郵電大學(xué) 中國(guó)大學(xué)慕課答案
- 有限空間安全檢查檔案(含檢查記錄、臺(tái)賬)全套
評(píng)論
0/150
提交評(píng)論