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