[教育]移動(dòng)編程課件第8章數(shù)據(jù)存儲(chǔ)與訪問(wèn)_第1頁(yè)
已閱讀1頁(yè),還剩157頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第8章 數(shù)據(jù)存儲(chǔ)和訪問(wèn),,,,本章學(xué)習(xí)目標(biāo):,掌握SharedPreferences的使用方法掌握各種文件存儲(chǔ)的區(qū)別與適用情況了解SQLite數(shù)據(jù)庫(kù)的特點(diǎn)和體系結(jié)構(gòu)掌握SQLite數(shù)據(jù)庫(kù)的建立和操作方法理解ContentProvider的用途和原理掌握ContentProvider的創(chuàng)建與使用方法,8.1 簡(jiǎn)單存儲(chǔ),8.1.1 SharedPreferencesSharedPreferences是一種輕量級(jí)的數(shù)據(jù)

2、保存方式通過(guò)SharedPreferences可以將NVP(Name/Value Pair,名稱/值對(duì))保存在Android的文件系統(tǒng)中,而且SharedPreferences完全屏蔽的對(duì)文件系統(tǒng)的操作過(guò)程開發(fā)人員僅是通過(guò)調(diào)用SharedPreferences對(duì)NVP進(jìn)行保存和讀取,8.1 簡(jiǎn)單存儲(chǔ),8.1.1 SharedPreferencesSharedPreferences不僅能夠保存數(shù)據(jù),還能夠?qū)崿F(xiàn)不同應(yīng)用程序間的數(shù)據(jù)共享

3、SharedPreferences支持三種訪問(wèn)模式私有(MODE_PRIVATE):僅有創(chuàng)建程序有權(quán)限對(duì)其進(jìn)行讀取或?qū)懭肴肿x(MODE_WORLD_READABLE):不僅創(chuàng)建程序可以對(duì)其進(jìn)行讀取或?qū)懭?,其他?yīng)用程序也讀取操作的權(quán)限,但沒(méi)有寫入操作的權(quán)限全局寫(MODE_WORLD_WRITEABLE):創(chuàng)建程序和其他程序都可以對(duì)其進(jìn)行寫入操作,但沒(méi)有讀取的權(quán)限,8.1 簡(jiǎn)單存儲(chǔ),8.1.1 SharedPreferences

4、在使用SharedPreferences前,先定義SharedPreferences的訪問(wèn)模式下面的代碼將訪問(wèn)模式定義為私有模式有的時(shí)候需要將SharedPreferences的訪問(wèn)模式設(shè)定為即可以全局讀,也可以全局寫,這樣就需要將兩種模式寫成下面的方式,8.1 簡(jiǎn)單存儲(chǔ),8.1.1 SharedPreferences定義SharedPreferences的名稱,這個(gè)名稱與在Android文件系統(tǒng)中保存的文件同名。因此,只要具

5、有相同的SharedPreferences名稱的NVP內(nèi)容,都會(huì)保存在同一個(gè)文件中為了可以使用SharedPreferences,需要將訪問(wèn)模式和SharedPreferences名稱作為參數(shù),傳遞到getSharedPreferences()函數(shù),并獲取到SharedPreferences對(duì)象,8.1 簡(jiǎn)單存儲(chǔ),8.1.1 SharedPreferences在獲取到SharedPreferences對(duì)象后,則可以通過(guò)Shared

6、Preferences.Editor類對(duì)SharedPreferences進(jìn)行修改,最后調(diào)用commit()函數(shù)保存修改內(nèi)容SharedPreferences廣泛支持各種基本數(shù)據(jù)類型,包括整型、布爾型、浮點(diǎn)型和長(zhǎng)型等等,8.1 簡(jiǎn)單存儲(chǔ),8.1.1 SharedPreferences如果需要從已經(jīng)保存的SharedPreferences中讀取數(shù)據(jù),同樣是調(diào)用getSharedPreferences()函數(shù),并在函數(shù)的第1個(gè)參數(shù)中指明

7、需要訪問(wèn)的SharedPreferences名稱,最后通過(guò)get()函數(shù)獲取保存在SharedPreferences中的NVPget()函數(shù)的第1個(gè)參數(shù)是NVP的名稱第2個(gè)參數(shù)是在無(wú)法獲取到數(shù)值的時(shí)候使用的缺省值,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例通過(guò)SimplePreferenceDemo示例介紹具體說(shuō)明SharedPreferences的文件保存位置和保存格式下圖是SimplePreferenceDemo示例的用戶界

8、面用戶在界面上的輸入的信息,將通過(guò)SharedPreferences在Activity關(guān)閉時(shí)進(jìn)行保存。當(dāng)應(yīng)用程序重新開啟時(shí),保存在SharedPreferences的信息將被讀取出來(lái),并重新呈現(xiàn)在用戶界面上,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例SimplePreferenceDemo示例運(yùn)行后,通過(guò)FileExplorer查看/data/data下的數(shù)據(jù),Android為每個(gè)應(yīng)用程序建立了與包同名的目錄,用來(lái)保存應(yīng)用程序產(chǎn)生的數(shù)據(jù),這

9、些數(shù)據(jù)包括文件、SharedPreferences文件和數(shù)據(jù)庫(kù)等SharedPreferences文件就保存在/data/data//shared_prefs目錄下,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例在本示例中,shared_prefs目錄下生成了一個(gè)名為SaveSetting.xml的文件這個(gè)文件就是保存SharedPreferences的文件,文件大小為170字節(jié),在Linux下的權(quán)限為“-rw-rw-rw”,8.1

10、簡(jiǎn)單存儲(chǔ),8.1.2 示例在Linux系統(tǒng)中,文件權(quán)限分別描述了創(chuàng)建者、同組用戶和其他用戶對(duì)文件的操作限制。x表示可執(zhí)行,r表示可讀,w表示可寫,d表示目錄,-表示普通文件。因此,“-rw-rw-rw”表示SaveSetting.xml可以被創(chuàng)建者、同組用戶和其他用戶進(jìn)行讀取和寫入操作,但不可執(zhí)行產(chǎn)生這樣的文件權(quán)限與程序人員設(shè)定的SharedPreferences的訪問(wèn)模式有關(guān),“-rw-rw-rw”的權(quán)限是“全局讀+全局寫”的結(jié)果

11、如果將SharedPreferences的訪問(wèn)模式設(shè)置為私有,則文件權(quán)限將成為“-rw-rw ---”,表示僅有創(chuàng)建者和同組用戶具有讀寫文件的權(quán)限,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例SaveSetting.xml文件是以XML格式保存的信息,內(nèi)容如圖如下,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例SimplePreferenceDemo示例在onStart()函數(shù)中調(diào)用loadSharedPreferences()函數(shù),讀取保存在Shar

12、edPreferences中的姓名、年齡和身高信息,并顯示在用戶界面上當(dāng)Activity關(guān)閉時(shí),在onStop()函數(shù)調(diào)用saveSharedPreferences(),保存界面上的信息SimplePreferenceDemo.java的完整代碼,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例示例SharePreferenceDemo將

13、說(shuō)明如何讀取其他應(yīng)用程序保存的SharedPreferences數(shù)據(jù)下圖是SharePreferenceDemo示例的用戶界面示例將讀取SimplePreferenceDemo示例保存的信息,并在程序啟動(dòng)時(shí)顯示在用戶界面上,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例下面給出SharePreferenceDemo示例的核心代碼,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例第8行代碼調(diào)用了createPackageContext()獲取到了S

14、implePreferenceDemo示例的Context第8行代碼第1個(gè)參數(shù)是SimplePreferenceDemo的包名稱,在代碼第1行進(jìn)行了定義第2個(gè)參數(shù)Context.CONTEXT_IGNORE_SECURIT表示忽略所有可能產(chǎn)生的安全問(wèn)題。這段代碼可能引發(fā)異常,因此必須防止在try/catch中,8.1 簡(jiǎn)單存儲(chǔ),8.1.2 示例在代碼第12行,通過(guò)Context得到了SimplePreferenceDemo示例的S

15、haredPreferences對(duì)象,同樣在getSharedPreferences()函數(shù)中,需要將正確的SharedPreferences名稱傳遞給函數(shù)訪問(wèn)其他應(yīng)用程序的SharedPreferences必須滿足三個(gè)條件共享者需要將SharedPreferences的訪問(wèn)模式設(shè)置為全局讀或全局寫訪問(wèn)者需要知道共享者的包名稱和SharedPreferences的名稱,以通過(guò)Context獲得SharedPreferences對(duì)象

16、訪問(wèn)者需要確切知道每個(gè)數(shù)據(jù)的名稱和數(shù)據(jù)類型,用以正確讀取數(shù)據(jù),8.2 文件存儲(chǔ),Android使用的是基于Linux的文件系統(tǒng),程序開發(fā)人員可以建立和訪問(wèn)程序自身的私有文件,也可以訪問(wèn)保存在資源目錄中的原始文件和XML文件,還可以在SD卡等外部存儲(chǔ)設(shè)備中保存文件,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ) Android系統(tǒng)允許應(yīng)用程序創(chuàng)建僅能夠自身訪問(wèn)的私有文件,文件保存在設(shè)備的內(nèi)部存儲(chǔ)器上,在Linux系統(tǒng)下的/data/data/

17、/files目錄中Android系統(tǒng)不僅支持標(biāo)準(zhǔn)Java的IO類和方法,還提供了能夠簡(jiǎn)化讀寫流式文件過(guò)程的函數(shù)主要介紹的兩個(gè)函數(shù)openFileOutput()openFileInput(),8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)openFileOutput()函數(shù)openFileOutput()函數(shù)為寫入數(shù)據(jù)做準(zhǔn)備而打開的應(yīng)用程序私文件,如果指定的文件不存在,則創(chuàng)建一個(gè)新的文件openFileOutput()函數(shù)的語(yǔ)法格

18、式如下第1個(gè)參數(shù)是文件名稱,這個(gè)參數(shù)不可以包含描述路徑的斜杠第2個(gè)參數(shù)是操作模式函數(shù)的返回值是FileOutputStream類型,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)openFileOutput()函數(shù)Android系統(tǒng)支持四種文件操作模式,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)openFileOutput()函數(shù)使用openFileOutput()函數(shù)建立新文件的示例代碼如下第1行代碼定義了建立文件的名稱

19、fileDemo.txt第2行代碼使用openFileOutput()函數(shù)以私有模式建立文件第4行代碼調(diào)用write()函數(shù)將數(shù)據(jù)寫入文件第5行代碼調(diào)用flush()函數(shù)將所有剩余的數(shù)據(jù)寫入文件第6行代碼調(diào)用close()函數(shù)關(guān)閉FileOutputStream,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)openFileOutput()函數(shù)為了提高文件系統(tǒng)的性能,一般調(diào)用write()函數(shù)時(shí),如果寫入的數(shù)據(jù)量較小,系統(tǒng)會(huì)把數(shù)據(jù)保

20、存在數(shù)據(jù)緩沖區(qū)中,等數(shù)據(jù)量累積到一定程度時(shí)再一次性的寫入文件中由上可知,在調(diào)用close()函數(shù)關(guān)閉文件前,務(wù)必要調(diào)用flush()函數(shù),將緩沖區(qū)內(nèi)所有的數(shù)據(jù)寫入文件,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)openFileInput()函數(shù)openFileInput()函數(shù)為讀取數(shù)據(jù)做準(zhǔn)備而打開應(yīng)用程序私文件openFileInput()函數(shù)的語(yǔ)法格式如下第1個(gè)參數(shù)也是文件名稱,同樣不允許包含描述路徑的斜杠,8.2 文件存

21、儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)openFileInput()函數(shù)使用openFileInput ()函數(shù)打開已有文件的示例代碼如下上面的兩部分代碼在實(shí)際使用過(guò)程中會(huì)遇到錯(cuò)誤提示,因?yàn)槲募僮骺赡軙?huì)遇到各種問(wèn)題而最終導(dǎo)致操作失敗,因此代碼應(yīng)該使用try/catch捕獲可能產(chǎn)生的異常,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)InternalFileDemo示例用來(lái)演示在內(nèi)部存儲(chǔ)器上進(jìn)行文件寫入和讀取InternalFileDem

22、o示例用戶界面如圖,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)InternalFileDemo示例的核心代碼,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ),8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ),8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)程序運(yùn)行后,在/data/data/edu.hrbeu.InternalFileDemo/files/目錄下,找到了新建立的fileDemo.txt文件,8.2 文件存儲(chǔ),8.2.1 內(nèi)部存儲(chǔ)file

23、Demo.txt文件fileDemo.txt從文件權(quán)限上進(jìn)行分析,“-rw-rw---”表明文件僅允許文件創(chuàng)建者和同組用戶讀寫,其他用戶無(wú)權(quán)使用文件的大小為9個(gè)字節(jié),保存的數(shù)據(jù)為“Some data”,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)Android的外部存儲(chǔ)設(shè)備指的是SD卡(Secure Digital Memory Card),是一種廣泛使用于數(shù)碼設(shè)備上的記憶卡不是所有的Android手機(jī)都有SD卡,但A

24、ndroid系統(tǒng)提供了對(duì)SD卡的便捷的訪問(wèn)方法,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)SD卡適用于保存大尺寸的文件或者是一些無(wú)需設(shè)置訪問(wèn)權(quán)限的文件,可以保存錄制的大容量的視頻文件和音頻文件等SD卡使用的是FAT(File Allocation Table)的文件系統(tǒng),不支持訪問(wèn)模式和權(quán)限控制,但可以通過(guò)Linux文件系統(tǒng)的文件訪問(wèn)權(quán)限的控制保證文件的私密性Android模擬器支持SD卡,但模擬器中沒(méi)有缺省的SD卡,開發(fā)人員須在模擬

25、器中手工添加SD卡的映像文件,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)使用/tools目錄下的mksdcard工具創(chuàng)建SD卡映像文件,命令如下第1個(gè)參數(shù)-1表示后面的字符串是SD卡的標(biāo)簽,這個(gè)新建立的SD卡的標(biāo)簽是SDCARD第2個(gè)參數(shù)256M表示SD卡的容量是256兆最后一個(gè)參數(shù)表示SD卡映像文件的保存位置,上面的命令將映像保存在E:\android目錄下sdcard_file文件中。在CMD中執(zhí)行該命令后,則可在所指定的目

26、錄中找到生產(chǎn)的SD卡映像文件,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)如果希望Android模擬器啟動(dòng)時(shí)能夠自動(dòng)加載指定的SD卡,還需要在模擬器的“運(yùn)行設(shè)置”(Run Configurations)中添加SD卡加載命令SD卡加載命令中只要指明映像文件位置即可SD卡加載命令,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)測(cè)試SD卡映像是否正確加載在模擬器啟動(dòng)后,使用FileExplorer向SD卡中隨意上傳一個(gè)文件,如果文件上傳成功,則表

27、明SD卡映像已經(jīng)成功加載向SD卡中成功上傳了一個(gè)測(cè)試文件test.txt,文件顯示在/sdcard目錄下,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)編程訪問(wèn)SD卡首先需要檢測(cè)系統(tǒng)的/sdcard目錄是否可用如果不可用,則說(shuō)明設(shè)備中的SD卡已經(jīng)被移除,在Android模擬器則表明SD卡映像沒(méi)有被正確加載如果可用,則直接通過(guò)使用標(biāo)準(zhǔn)的Java.io.File類進(jìn)行訪問(wèn)將數(shù)據(jù)保存在SD卡通過(guò)“生產(chǎn)隨機(jī)數(shù)列”按鈕生產(chǎn)10個(gè)隨機(jī)小數(shù)通

28、過(guò)“寫入SD卡”按鈕將生產(chǎn)的數(shù)據(jù)保存在SD卡的目錄下SDcardFileDemo示例說(shuō)明了如何將數(shù)據(jù)保存在SD卡,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)下圖是SDcardFileDemo示例的用戶界面,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)SDcardFileDemo示例運(yùn)行后,在每次點(diǎn)擊“寫入SD卡”按鈕后,都會(huì)在SD卡中生產(chǎn)一個(gè)新文件,文件名各不相同SD卡中生產(chǎn)的文件,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)SDcardFi

29、leDemo示例與InternalFileDemo示例的核心代碼比較相似SDcardFileDemo示例與InternalFileDemo示例的不同之處第7行代碼中添加了/sdcard目錄存在性檢查第8行代碼使用“絕對(duì)目錄+文件名”的形式表示新建立的文件第12行代碼寫入文件前對(duì)文件存在性和可寫入性進(jìn)行檢查第5行代碼為了保證在SD卡中多次寫入時(shí)文件名不會(huì)重復(fù),在文件名中使用了唯一且不重復(fù)的標(biāo)識(shí),這個(gè)標(biāo)識(shí)通過(guò)調(diào)用System.cu

30、rrentTimeMillis()函數(shù)獲得,表示從1970年00:00:00到當(dāng)前所經(jīng)過(guò)的毫秒數(shù),8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ)下面是SDcardFileDemo示例的核心代碼,8.2 文件存儲(chǔ),8.2.2 外部存儲(chǔ),8.2 文件存儲(chǔ),8.2.3 資源文件程序開發(fā)人員可以將程序開發(fā)階段已經(jīng)準(zhǔn)備好的原始格式文件和XML文件分別存放在/res/raw和/res/xml目錄下,供應(yīng)用程序在運(yùn)行時(shí)進(jìn)行訪問(wèn)原始格式文件可以是任何格式

31、的文件,例如視頻格式文件、音頻格式文件、圖像文件和數(shù)據(jù)文件等等,在應(yīng)用程序編譯和打包時(shí),/res/raw目錄下的所有文件都會(huì)保留原有格式不變/res/xml目錄下的XML文件,一般用來(lái)保存格式化的數(shù)據(jù),在應(yīng)用程序編譯和打包時(shí)會(huì)將XML文件轉(zhuǎn)換為高效的二進(jìn)制格式,應(yīng)用程序運(yùn)行時(shí)會(huì)以特殊的方式進(jìn)行訪問(wèn),8.2 文件存儲(chǔ),8.2.3 資源文件ResourceFileDemo示例演示了如何在程序運(yùn)行時(shí)訪問(wèn)資源文件當(dāng)用戶點(diǎn)擊“讀取原始文件”

32、按鈕時(shí),程序?qū)⒆x取/res/raw/raw_file.txt文件,并將內(nèi)容顯示在界面上,8.2 文件存儲(chǔ),8.2.3 資源文件當(dāng)用戶點(diǎn)擊“讀取XML文件”按鈕時(shí),程序?qū)⒆x取/res/xml/people.xml文件,并將內(nèi)容顯示在界面上,8.2 文件存儲(chǔ),8.2.3 資源文件讀取原始格式文件,首先需要調(diào)用getResource()函數(shù)獲得資源對(duì)象,然后通過(guò)調(diào)用資源對(duì)象的openRawResource()函數(shù),以二進(jìn)制流的形式打開指定

33、的原始格式文件。在讀取文件結(jié)束后,調(diào)用close()函數(shù)關(guān)閉文件流ResourceFileDemo示例中關(guān)于讀取原始格式文件的核心代碼如下,8.2 文件存儲(chǔ),8.2.3 資源文件代碼第8行的new String(reader,"utf-8"),表示以UTF-8的編碼方式,從字節(jié)數(shù)組中實(shí)例化一個(gè)字符串程序開發(fā)人員需要確定/res/raw/raw_file.txt文件使用的是UTF-8編碼方式,否則程

34、序運(yùn)行時(shí)會(huì)產(chǎn)生亂碼,8.2 文件存儲(chǔ),8.2.3 資源文件確認(rèn)的方法右擊raw_file.txt文件選擇“Properties”打開raw_file.txt文件的屬性設(shè)置框在Resource欄下的Text file encoding中,選擇“Other:UTF-8”,8.2 文件存儲(chǔ),8.2.3 資源文件/res/xml目錄下的XML文件會(huì)轉(zhuǎn)換為一種高效的二進(jìn)制格式說(shuō)明如何在程序運(yùn)行時(shí)讀取/res/xml目錄下的XML文件

35、首先在/res/xml目錄下創(chuàng)建一個(gè)名為people.xml的文件XML文件定義了多個(gè)元素,每個(gè)元素都包含三個(gè)屬性name、age和height,分別表示姓名、年齡和身高/res/xml/people.xml文件代碼如下,8.2 文件存儲(chǔ),8.2.3 資源文件讀取XML格式文件首先通過(guò)調(diào)用資源對(duì)象的getXml()函數(shù),獲取到XML解析器XmlPullParserXmlPullParser是Android平臺(tái)標(biāo)準(zhǔn)的XML解析器

36、,這項(xiàng)技術(shù)來(lái)自一個(gè)開源的XML解析API項(xiàng)目XMLPULLResourceFileDemo示例中關(guān)于讀取XML文件的核心代碼如下,8.2 文件存儲(chǔ),8.2.3 資源文件,8.2 文件存儲(chǔ),8.2.3 資源文件第1行代碼通過(guò)資源對(duì)象的getXml()函數(shù)獲取到XML解析器第4行代碼的parser.next()方法可以獲取到高等級(jí)的解析事件,并通過(guò)對(duì)比確定事件類型第5行代碼使用getName()函數(shù)獲得元素的名稱第10行

37、代碼使用getAttributeCount()函數(shù)獲取元素的屬性數(shù)量,8.2 文件存儲(chǔ),8.2.3 資源文件第12行代碼通過(guò)getAttributeName()函數(shù)得到屬性名稱第14行到第19行代碼通過(guò)分析屬性名獲取到正確的屬性值第23行代碼將屬性值整理成需要顯示的信息XmlPullParser的XML事件類型,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.1 SQLite數(shù)據(jù)庫(kù)SQLite是一個(gè)開源的嵌入式關(guān)系數(shù)據(jù)庫(kù),在2000年由D. Ri

38、chard Hipp發(fā)布SQLite數(shù)據(jù)庫(kù)特點(diǎn)更加適用于嵌入式系統(tǒng),嵌入到使用它的應(yīng)用程序中占用非常少,運(yùn)行高效可靠,可移植性好提供了零配置(zero-configuration)運(yùn)行模式SQLite數(shù)據(jù)庫(kù)不僅提高了運(yùn)行效率,而且屏蔽了數(shù)據(jù)庫(kù)使用和管理的復(fù)雜性,程序僅需要進(jìn)行最基本的數(shù)據(jù)操作,其他操作可以交給進(jìn)程內(nèi)部的數(shù)據(jù)庫(kù)引擎完成,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.1 SQLite數(shù)據(jù)庫(kù)SQLite數(shù)據(jù)庫(kù)采用了模塊化設(shè)計(jì),由8個(gè)

39、獨(dú)立的模塊構(gòu)成,這些獨(dú)立模塊又構(gòu)成了三個(gè)主要的子系統(tǒng),模塊將復(fù)雜的查詢過(guò)程分解為細(xì)小的工作進(jìn)行處理,,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.1 SQLite數(shù)據(jù)庫(kù)接口由SQLite C API組成,因此無(wú)論是應(yīng)用程序、腳本,還是庫(kù)文件,最終都是通過(guò)接口與SQLite交互編譯器由分詞器和分析器組成分詞器和分析器對(duì)SQL語(yǔ)句進(jìn)行語(yǔ)法檢查,然后把SQL語(yǔ)句轉(zhuǎn)化為底層能更方便處理的分層的數(shù)據(jù)結(jié)構(gòu),這種分層的數(shù)據(jù)結(jié)構(gòu)稱為“語(yǔ)法樹”把語(yǔ)法樹傳給代碼

40、生成器進(jìn)行處理,生成一種針對(duì)SQLite的匯編代碼最后由虛擬機(jī)執(zhí)行,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.1 SQLite數(shù)據(jù)庫(kù)虛擬機(jī)SQLite數(shù)據(jù)庫(kù)體系結(jié)構(gòu)中最核心的部分是虛擬機(jī),也稱為虛擬數(shù)據(jù)庫(kù)引擎(Virtual Database Engine,VDBE)與Java虛擬機(jī)相似,虛擬數(shù)據(jù)庫(kù)引擎用來(lái)解釋執(zhí)行字節(jié)代碼虛擬數(shù)據(jù)庫(kù)引擎的字節(jié)代碼由128個(gè)操作碼構(gòu)成,這些操作碼主要用以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,每一條指令都可以完成特定的數(shù)據(jù)庫(kù)操作,

41、或以特定的方式處理?xiàng)5膬?nèi)容,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.1 SQLite數(shù)據(jù)庫(kù)后端后端由B-樹、頁(yè)緩存和操作系統(tǒng)接口構(gòu)成B-樹的主要功能就是索引,它維護(hù)著各個(gè)頁(yè)面之間的復(fù)雜的關(guān)系,便于快速找到所需數(shù)據(jù)頁(yè)緩存的主要作用就是通過(guò)操作系統(tǒng)接口在B-樹和磁盤之間傳遞頁(yè)面B-樹和頁(yè)緩存共同對(duì)數(shù)據(jù)進(jìn)行管理,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.1 SQLite數(shù)據(jù)庫(kù)SQLite數(shù)據(jù)庫(kù)具有很強(qiáng)的移植性,可以運(yùn)行在Windows,Linux,BSD,

42、Mac OS X和一些商用Unix系統(tǒng),比如Sun的Solaris,IBM的AIXSQLite數(shù)據(jù)庫(kù)也可以工作在許多嵌入式操作系統(tǒng)下,例如QNX,VxWorks,Palm OS,Symbin和Windows CESQLite的核心大約有3萬(wàn)行標(biāo)準(zhǔn)C代碼,模塊化的設(shè)計(jì)使這些代碼更加易于理解,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)手動(dòng)建立數(shù)據(jù)庫(kù)指的是使用sqlite3工具,通過(guò)手工輸入命令行完成數(shù)據(jù)庫(kù)的建立過(guò)程sqlite3是SQ

43、Lite數(shù)據(jù)庫(kù)自帶的一個(gè)基于命令行的SQL命令執(zhí)行工具,并可以顯示命令執(zhí)行結(jié)果sqlite3工具被集成在Android系統(tǒng)中,用戶在Linux的命令行界面中輸入sqlite3可啟動(dòng)sqlite3工具,并得到工具的版本信息,如下面的代碼所示啟動(dòng)Linux的命令行界面的方法是在CMD中輸入adb shell命令,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)在啟動(dòng)sqlite3工具后,提示符從“#”變?yōu)椤皊qlite>”,表示命令行界

44、面進(jìn)入與SQLite數(shù)據(jù)庫(kù)的交互模式,此時(shí)可以輸入命令建立、刪除或修改數(shù)據(jù)庫(kù)的內(nèi)容正確退出sqlite3工具的方法是使用.exit命令原則上,每個(gè)應(yīng)用程序的數(shù)據(jù)庫(kù)都保存在各自的/data/data//databases目錄下,但如果使用手工方式建立數(shù)據(jù)庫(kù),則必須手工建立數(shù)據(jù)庫(kù)目錄,目前版本無(wú)須修改數(shù)據(jù)庫(kù)目錄的權(quán)限,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)在SQLite數(shù)據(jù)庫(kù)中,每個(gè)數(shù)據(jù)庫(kù)保存在一個(gè)獨(dú)立的文件中,使用sqlite3

45、工具后加文件名的方式打開數(shù)據(jù)庫(kù)文件,如果指定文件不存在,sqlite3工具則自動(dòng)創(chuàng)建新文件下面的代碼將創(chuàng)建名為people的數(shù)據(jù)庫(kù),在文件系統(tǒng)中將產(chǎn)生一個(gè)名為people.db的數(shù)據(jù)庫(kù)文件,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)下面的代碼在新創(chuàng)建的數(shù)據(jù)庫(kù)中,構(gòu)造了一個(gè)名為peopleinfo的表,使用create table命令,關(guān)系模式為peopleinfo ( _id, name, age, height)表包含四個(gè)屬性,_

46、id是整型的主鍵;name表示姓名,字符型,not null表示這個(gè)屬性一定要填寫,不可以為空值;age表示年齡,整數(shù)型;height表示身高,浮點(diǎn)型,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)為了確認(rèn)數(shù)據(jù)表是否創(chuàng)建成功,可以使用.tables命令,顯示當(dāng)前數(shù)據(jù)庫(kù)中的所有表從下面的代碼中可以觀察到,當(dāng)前數(shù)據(jù)庫(kù)僅有一個(gè)名為peopleinfo的表當(dāng)然,也可以使用.schema命令查看建立表時(shí)使用的SQL命令。如果當(dāng)前數(shù)據(jù)庫(kù)中包含多

47、個(gè)表,則可以使用[.schema 表名]的形式,顯示指定表的建立命令,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)向peopleinfo表中添加數(shù)據(jù),使用insert into … values命令代碼運(yùn)行成功后,數(shù)據(jù)庫(kù)的peopleinfo表將有三條數(shù)據(jù)。因?yàn)開id是自增加的主鍵,因此在輸入null后,SQLite數(shù)據(jù)庫(kù)會(huì)自動(dòng)填寫該項(xiàng)的內(nèi)容,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)在數(shù)據(jù)添加完畢后,使用select命令,顯示指定

48、數(shù)據(jù)表中的所有數(shù)據(jù)信息,命令格式為[select 屬性 from 表名]下面的代碼用來(lái)顯示peopleinfo表的所有數(shù)據(jù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)上面的查詢結(jié)果看起來(lái)不是非常直觀,可以使用mode命令將結(jié)果輸出格式更改為“表格”方式mode命令除了支持常見(jiàn)的column格式為,還支持csv格式、html格式、insert格式、line格式、list格式、tabs格式和tcl格式,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手

49、動(dòng)建庫(kù)更新數(shù)據(jù)可以使用update命令,命令格式為[update 表名 set 屬性=“新值” where 條件]更新數(shù)據(jù)后,同樣使用select命令顯示數(shù)據(jù),則可以確定數(shù)據(jù)是否正確更新下面的代碼將姓名為L(zhǎng)ily數(shù)據(jù)中的高度值更新為1.88,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)刪除數(shù)據(jù)可以使用delete命令,命令格式為[delete from 表名where 條件]下面的代碼將_id為3數(shù)據(jù)從表peopleinfo中刪除

50、,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù)sqlite3工具還支持大量的命令,可以使用.help命令查詢sqlite3的命令列表,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.2 手動(dòng)建庫(kù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)在代碼中動(dòng)態(tài)建立數(shù)據(jù)庫(kù)是比較常用的方法在程序運(yùn)行過(guò)程中,當(dāng)需要進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),應(yīng)用程序會(huì)首先嘗試打開數(shù)據(jù)庫(kù),此時(shí)如果數(shù)據(jù)庫(kù)并不存在,程序則會(huì)自動(dòng)建立數(shù)據(jù)庫(kù),然后再打開數(shù)據(jù)庫(kù)在編

51、程實(shí)現(xiàn)時(shí),一般將所有對(duì)數(shù)據(jù)庫(kù)的操作都封裝在一個(gè)類中,因此只要調(diào)用這個(gè)類,就可以完成對(duì)數(shù)據(jù)庫(kù)的添加、更新、刪除和查詢等操作,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)下面內(nèi)容是DBAdapter類的部分代碼,封裝了數(shù)據(jù)庫(kù)的建立、打開和關(guān)閉等操作,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)從代碼的第2行到第9行可以看出,在DBAdapter類中首先聲明了數(shù)據(jù)庫(kù)的基本信息,包括數(shù)據(jù)庫(kù)文件的名

52、稱、數(shù)據(jù)庫(kù)表格名稱和數(shù)據(jù)庫(kù)版本,以及數(shù)據(jù)庫(kù)表中的屬性名稱從這些基本信息上不難發(fā)現(xiàn),這個(gè)數(shù)據(jù)庫(kù)與前一小節(jié)手動(dòng)建立的數(shù)據(jù)庫(kù)是完全相同的,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)第11行代碼聲明了SQLiteDatabase對(duì)象db。SQLiteDatabase類封裝了非常多的方法,用以建立、刪除數(shù)據(jù)庫(kù),執(zhí)行SQL命令,對(duì)數(shù)據(jù)進(jìn)行管理等工作第13行代碼聲明了一個(gè)非常重要的幫助類SQLiteOpenHelper,這個(gè)幫助類可以輔助建立、更

53、新和打開數(shù)據(jù)庫(kù)第21行代碼定義了open()函數(shù)用來(lái)打開數(shù)據(jù)庫(kù),但open()函數(shù)中并沒(méi)有任何對(duì)數(shù)據(jù)庫(kù)進(jìn)行實(shí)際操作的代碼,而是調(diào)用了SQLiteOpenHelper類的getWritableDatabase()函數(shù)和getReadableDatabase()函數(shù)。這個(gè)兩個(gè)函數(shù)會(huì)根據(jù)數(shù)據(jù)庫(kù)是否存在、版本號(hào)和是否可寫等情況,決定在返回?cái)?shù)據(jù)庫(kù)對(duì)象前,是否需要建立數(shù)據(jù)庫(kù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)在代碼第30行的close()

54、函數(shù)中,調(diào)用了SQLiteDatabase對(duì)象的close()方法關(guān)閉數(shù)據(jù)庫(kù)這是上面的代碼中,唯一的一個(gè)地方直接調(diào)用了SQLiteDatabase對(duì)象的方法SQLiteDatabase中也封裝了打開數(shù)據(jù)庫(kù)的函數(shù)openDatabases()和創(chuàng)建數(shù)據(jù)庫(kù)函數(shù)openOrCreateDatabases(),因?yàn)榇a中使用了幫助類SQLiteOpenHelper,從而避免直接調(diào)用SQLiteDatabase中的打開和創(chuàng)建數(shù)據(jù)庫(kù)的方法,簡(jiǎn)化

55、了數(shù)據(jù)庫(kù)打開過(guò)程中繁瑣的邏輯判斷過(guò)程代碼第15行實(shí)現(xiàn)了內(nèi)部靜態(tài)類DBOpenHelper,繼承了幫助類SQLiteOpenHelper,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)重載了onCreate()函數(shù)和onUpgrade()函數(shù)的代碼如下,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)第5行到第7行代碼的是創(chuàng)建表的SQL命令第10行和第15行代碼分別重載了onCreate()函數(shù)和onUpgrade()函數(shù),這是繼承

56、SQLiteOpenHelper類必須重載的兩個(gè)函數(shù)。onCreate()函數(shù)在數(shù)據(jù)庫(kù)第一次建立時(shí)被調(diào)用,一般用來(lái)用來(lái)創(chuàng)建數(shù)據(jù)庫(kù)中的表,并做適當(dāng)?shù)某跏蓟ぷ?8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)在代碼第11行中,通過(guò)調(diào)用SQLiteDatabase對(duì)象的execSQL()方法,執(zhí)行創(chuàng)建表的SQL命令。onUpgrade()函數(shù)在數(shù)據(jù)庫(kù)需要升級(jí)時(shí)被調(diào)用,一般用來(lái)刪除舊的數(shù)據(jù)庫(kù)表,并將數(shù)據(jù)轉(zhuǎn)移到新版本的數(shù)據(jù)庫(kù)表中第16行和第17行代

57、碼中,為了簡(jiǎn)單起見(jiàn),并沒(méi)有做任何的的數(shù)據(jù)轉(zhuǎn)移,而僅僅刪除原有的表后建立新的數(shù)據(jù)庫(kù)表,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.3 代碼建庫(kù)程序開發(fā)人員不應(yīng)直接調(diào)用onCreate()和onUpgrade()函數(shù),而應(yīng)該由SQLiteOpenHelper類來(lái)決定何時(shí)調(diào)用這兩個(gè)函數(shù)SQLiteOpenHelper類的getWritableDatabase()函數(shù)和getReadableDatabase()函數(shù)是可以直接調(diào)用的函數(shù)getWritabl

58、eDatabase()函數(shù)用來(lái)建立或打開可讀寫的數(shù)據(jù)庫(kù)對(duì)象,一旦函數(shù)調(diào)用成功,數(shù)據(jù)庫(kù)對(duì)象將被緩存,任何需要使用數(shù)據(jù)庫(kù)對(duì)象時(shí),都可以調(diào)用這個(gè)方法獲取到數(shù)據(jù)庫(kù)對(duì)象,但一定要在不使用時(shí)調(diào)用close()函數(shù)關(guān)閉數(shù)據(jù)庫(kù)如果保存數(shù)據(jù)庫(kù)文件的磁盤空間已滿,調(diào)用getWritableDatabase()函數(shù)則無(wú)法獲得可讀寫的數(shù)據(jù)庫(kù)對(duì)象,這時(shí)可以調(diào)用getReadableDatabase()函數(shù),獲得一個(gè)只讀的數(shù)據(jù)庫(kù)對(duì)象,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.

59、3 代碼建庫(kù)如果程序開發(fā)人員不希望使用SQLiteOpenHelper類,同樣可以直接創(chuàng)建數(shù)據(jù)庫(kù)首先調(diào)用openOrCreateDatabases()函數(shù)創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象然后執(zhí)行SQL命令建立數(shù)據(jù)庫(kù)中的表和直接的關(guān)系示例代碼如下,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作數(shù)據(jù)操作是指對(duì)數(shù)據(jù)的添加、刪除、查找和更新的操作通過(guò)執(zhí)行SQL命名完成數(shù)據(jù)操作,但推薦使用Android提供的專用類和方法,這些類和方法更加簡(jiǎn)潔、易用為了使D

60、BAdapter類支持對(duì)數(shù)據(jù)的添加、刪除、更新和查找等功能,在DBAdapter類中增加下面的這些函數(shù)insert(People people)用來(lái)添加一條數(shù)據(jù)queryAllData()用來(lái)獲取全部數(shù)據(jù)queryOneData(long id)根據(jù)id獲取一條數(shù)據(jù)deleteAllData()用來(lái)刪除全部數(shù)據(jù)deleteOneData(long id)根據(jù)id刪除一條數(shù)據(jù)updateOneData(long id , Pe

61、ople people)根據(jù)id更新一條數(shù)據(jù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作ConvertToPeople(Cursor cursor)是私有函數(shù),作用是將查詢結(jié)果轉(zhuǎn)換為用來(lái)存儲(chǔ)數(shù)據(jù)自定義的People類對(duì)象People類的包含四個(gè)公共屬性,分別為ID、Name、Age和Height,對(duì)應(yīng)數(shù)據(jù)庫(kù)中的四個(gè)屬性值重載toString()函數(shù),主要是便于界面顯示的需要,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作P

62、eople類的代碼如下,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作SQLiteDatabase類的公共函數(shù)insert()、delete()、update()和query(),封裝了執(zhí)行的添加、刪除、更新和查詢功能的SQL命令下面分別介紹如何使用SQLiteDatabase類的公共函數(shù),完成數(shù)據(jù)的添加、刪除、更新和查詢等操作,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作添加功能首先構(gòu)造一個(gè)ContentValues對(duì)象,然后調(diào)用Con

63、tentValues對(duì)象的put()方法,將每個(gè)屬性的值寫入到ContentValues對(duì)象中,最后使用SQLiteDatabase對(duì)象的insert()函數(shù),將ContentValues對(duì)象中的數(shù)據(jù)寫入指定的數(shù)據(jù)庫(kù)表中insert()函數(shù)的返回值是新數(shù)據(jù)插入的位置,即ID值。ContentValues類是一個(gè)數(shù)據(jù)承載容器,主要用來(lái)向數(shù)據(jù)庫(kù)表中添加一條數(shù)據(jù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作第4行代碼向Conte

64、ntValues對(duì)象newValues中添加一個(gè)名稱/值對(duì),put()函數(shù)的第1個(gè)參數(shù)是名稱,第2個(gè)參數(shù)是值在第8行代碼的insert()函數(shù)中,第1個(gè)參數(shù)是數(shù)據(jù)表的名稱,第2個(gè)參數(shù)是在NULL時(shí)的替換數(shù)據(jù),第3個(gè)參數(shù)是需要向數(shù)據(jù)庫(kù)表中添加的數(shù)據(jù),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作刪除功能刪除數(shù)據(jù)比較簡(jiǎn)單,只需要調(diào)用當(dāng)前數(shù)據(jù)庫(kù)對(duì)象的delete()函數(shù),并指明表名稱和刪除條件即可delete()函數(shù)的第1個(gè)參數(shù)是數(shù)

65、據(jù)庫(kù)的表名稱,第2個(gè)參數(shù)是刪除條件在第2行代碼中,刪除條件為null,表示刪除表中的所有數(shù)據(jù)第6行代碼指明了需要?jiǎng)h除數(shù)據(jù)的id值,因此deleteOneData()函數(shù)僅刪除一條數(shù)據(jù),此時(shí)delete()函數(shù)的返回值表示被刪除的數(shù)據(jù)的數(shù)量,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作更新功能更新數(shù)據(jù)同樣要使用ContentValues對(duì)象,首先構(gòu)造ContentValues對(duì)象,然后調(diào)用put()函數(shù)將屬性的值寫入到ContentV

66、alues對(duì)象中,最后使用SQLiteDatabase對(duì)象的update()函數(shù),并指定數(shù)據(jù)的更新條件在代碼的第7行中,update()函數(shù)的第1個(gè)參數(shù)表示數(shù)據(jù)表的名稱,第2個(gè)參數(shù)是更新條件。update()函數(shù)的返回值表示數(shù)據(jù)庫(kù)表中被更新的數(shù)據(jù)數(shù)量,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作查詢功能首先介紹Cursor類。在Android系統(tǒng)中,數(shù)據(jù)庫(kù)查詢結(jié)果的返回值并不是數(shù)據(jù)集合的完整拷貝,而是返回?cái)?shù)據(jù)集的指針,這個(gè)指

67、針就是Cursor類Cursor類支持在查詢的數(shù)據(jù)集合中多種方式移動(dòng),并能夠獲取數(shù)據(jù)集合的屬性名稱和序號(hào),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作Cursor類的方法和說(shuō)明,,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作從Cursor中提取數(shù)據(jù)可以參考ConvertToPeople()函數(shù)的實(shí)現(xiàn)方法在提取Cursor數(shù)據(jù)中的數(shù)據(jù)前,推薦測(cè)試Cursor中的數(shù)據(jù)數(shù)量,避免在數(shù)據(jù)獲取中產(chǎn)生異常,例如代碼的第3行到第5行從Cursor中

68、提取數(shù)據(jù)使用類型安全的get()函數(shù),函數(shù)的輸入值為屬性的序號(hào),為了獲取屬性的序號(hào),可以使用getColumnIndex()函數(shù)獲取指定屬性的序號(hào),8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作要進(jìn)行數(shù)據(jù)查詢就需要調(diào)用SQLiteDatabase類的query()函數(shù),query()函數(shù)的語(yǔ)法如下query()函數(shù)的參數(shù)說(shuō)明,8.3 數(shù)據(jù)庫(kù)存儲(chǔ),8.3.4 數(shù)據(jù)操作根據(jù)id查詢數(shù)據(jù)的代碼

溫馨提示

  • 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論