版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第8章章 數(shù)據(jù)存儲(chǔ)和訪問數(shù)據(jù)存儲(chǔ)和訪問 本章學(xué)習(xí)目標(biāo): n掌握sharedpreferences的使用方法 n掌握各種文件存儲(chǔ)的區(qū)別與適用情況 n了解sqlite數(shù)據(jù)庫的特點(diǎn)和體系結(jié)構(gòu) n掌握sqlite數(shù)據(jù)庫的建立和操作方法 n理解contentprovider的用途和原理 n掌握contentprovider的創(chuàng)建與使用方法 8.1 簡(jiǎn)單存儲(chǔ) n8.1.1 sharedpreferences qsharedpreferences是一種輕量級(jí)的數(shù)據(jù)保存方式 q通過sharedpreferences可以將nvp(name/value pair, 名稱/值對(duì))保存在android的文件系統(tǒng)中,
2、而且 sharedpreferences完全屏蔽的對(duì)文件系統(tǒng)的操作過程 q開發(fā)人員僅是通過調(diào)用sharedpreferences對(duì)nvp進(jìn)行 保存和讀取 8.1 簡(jiǎn)單存儲(chǔ) n8.1.1 sharedpreferences qsharedpreferences不僅能夠保存數(shù)據(jù),還能夠?qū)崿F(xiàn)不 同應(yīng)用程序間的數(shù)據(jù)共享 qsharedpreferences支持三種訪問模式 n私有(mode_private):僅有創(chuàng)建程序有權(quán)限對(duì)其進(jìn) 行讀取或?qū)懭?n全局讀(mode_world_readable):不僅創(chuàng)建程 序可以對(duì)其進(jìn)行讀取或?qū)懭?,其他?yīng)用程序也讀取操作的 權(quán)限,但沒有寫入操作的權(quán)限 n全局寫(m
3、ode_world_writeable):創(chuàng)建程序和 其他程序都可以對(duì)其進(jìn)行寫入操作,但沒有讀取的權(quán)限 8.1 簡(jiǎn)單存儲(chǔ) n8.1.1 sharedpreferences q在使用sharedpreferences前,先定義 sharedpreferences的訪問模式 q下面的代碼將訪問模式定義為私有模式 q有的時(shí)候需要將sharedpreferences的訪問模式設(shè)定為 即可以全局讀,也可以全局寫,這樣就需要將兩種模式 寫成下面的方式 public static int mode = mode_private; public static int mode = context.mode_w
4、orld_readable + context.mode_world_writeable; 8.1 簡(jiǎn)單存儲(chǔ) n8.1.1 sharedpreferences q定義sharedpreferences的名稱,這個(gè)名稱與在android 文件系統(tǒng)中保存的文件同名。因此,只要具有相同的 sharedpreferences名稱的nvp內(nèi)容,都會(huì)保存在同一 個(gè)文件中 q為了可以使用sharedpreferences,需要將訪問模式和 sharedpreferences名稱作為參數(shù),傳遞到 getsharedpreferences()函數(shù),并獲取到 sharedpreferences對(duì)象 public
5、static final string preference_name = savesetting; sharedpreferences sharedpreferences = getsharedpreferences(preference_name, mode); 8.1 簡(jiǎn)單存儲(chǔ) n8.1.1 sharedpreferences q在獲取到sharedpreferences對(duì)象后,則可以通過 sharedpreferences.editor類對(duì)sharedpreferences進(jìn)行 修改,最后調(diào)用commit()函數(shù)保存修改內(nèi)容 qsharedpreferences廣泛支持各種基本數(shù)據(jù)類型
6、,包括 整型、布爾型、浮點(diǎn)型和長(zhǎng)型等等 1.sharedpreferences.editor editor = sharedpreferences.edit(); 2.editor.putstring(name, tom); 3.editor.putint(age, 20); 4.editor.putfloat(height, ); mit(); 8.1 簡(jiǎn)單存儲(chǔ) n8.1.1 sharedpreferences q如果需要從已經(jīng)保存的sharedpreferences中讀取數(shù)據(jù) ,同樣是調(diào)用getsharedpreferences()函數(shù),并在函數(shù) 的第1個(gè)參數(shù)中指明需要訪問的sharedp
7、references名稱 ,最后通過get()函數(shù)獲取保存在 sharedpreferences中的nvp qget()函數(shù)的第1個(gè)參數(shù)是nvp的名稱 q第2個(gè)參數(shù)是在無法獲取到數(shù)值的時(shí)候使用的缺省值 1.sharedpreferences sharedpreferences = getsharedpreferences(preference_name, mode); 2.string name = sharedpreferences.getstring(name,default name); 3.int age = sharedpreferences.getint(age, 20); 4.f
8、loat height = sharedpreferences.getfloat(height,); 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 q通過simplepreferencedemo示例介紹具體說明 sharedpreferences的文件保存位置和保存格式 q下圖是simplepreferencedemo示例的用戶界面 n用戶在界面上的輸入的信息,將通過sharedpreferences 在activity關(guān)閉時(shí)進(jìn)行保存。當(dāng)應(yīng)用程序重新開啟時(shí),保 存在sharedpreferences的信息將被讀取出來,并重新呈 現(xiàn)在用戶界面上 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 qsimplepre
9、ferencedemo示例運(yùn)行后,通過fileexplorer 查看/data/data下的數(shù)據(jù),android為每個(gè)應(yīng)用程序建立 了與包同名的目錄,用來保存應(yīng)用程序產(chǎn)生的數(shù)據(jù),這 些數(shù)據(jù)包括文件、sharedpreferences文件和數(shù)據(jù)庫等 qsharedpreferences文件就保存在/data/data/shared_prefs目錄下 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 q在本示例中,shared_prefs目錄下生成了一個(gè)名為 savesetting.xml的文件 q這個(gè)文件就是保存sharedpreferences的文件,文件大 小為170字節(jié),在linux下的權(quán)限為“-rw
10、-rw-rw” 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 q在linux系統(tǒng)中,文件權(quán)限分別描述了創(chuàng)建者、同組用 戶和其他用戶對(duì)文件的操作限制。x表示可執(zhí)行,r表示 可讀,w表示可寫,d表示目錄,-表示普通文件。因此 ,“-rw-rw-rw”表示savesetting.xml可以被創(chuàng)建者、 同組用戶和其他用戶進(jìn)行讀取和寫入操作,但不可執(zhí)行 q產(chǎn)生這樣的文件權(quán)限與程序人員設(shè)定的 sharedpreferences的訪問模式有關(guān),“-rw-rw-rw”的 權(quán)限是“全局讀+全局寫”的結(jié)果 q如果將sharedpreferences的訪問模式設(shè)置為私有,則 文件權(quán)限將成為“-rw-rw -”,表示僅有創(chuàng)建
11、者和同組 用戶具有讀寫文件的權(quán)限 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 qsavesetting.xml文件是以xml格式保存的信息,內(nèi)容 如圖如下 1. 2. 3. 4.tom 5. 6. 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 qsimplepreferencedemo示例在onstart()函數(shù)中調(diào)用 loadsharedpreferences()函數(shù),讀取保存在 sharedpreferences中的姓名、年齡和身高信息,并顯 示在用戶界面上 q當(dāng)activity關(guān)閉時(shí),在onstop()函數(shù)調(diào)用 savesharedpreferences(),保存界面上的信息 qsimpleprefe
12、rencedemo.java的完整代碼 1.package edu.hrbeu.simplepreferencedemo; 2. 3.import android.app.activity; 4.import android.content.context; 5.import android.content.sharedpreferences; 6.import android.os.bundle; 7.import android.widget.edittext; 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 8. 9.public class simplepreferencedemo extend
13、s activity 10. 11.private edittext nametext; 12.private edittext agetext; 13.private edittext heighttext; 14.public static final string preference_name = savesetting; 15.public static int mode = context.mode_world_readable + context.mode_world_writeable; 16. 17.override 18.public void oncreate(bundl
14、e savedinstancestate) 19.super.oncreate(savedinstancestate); 20.setcontentview(r.layout.main); 21.nametext = (edittext)findviewbyid(r.); 22.agetext = (edittext)findviewbyid(r.id.age); 23.heighttext = (edittext)findviewbyid(r.id.height); 24. 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 25. 26. override 27.public void o
15、nstart() 28.super.onstart(); 29.loadsharedpreferences(); 30. 31.override 32.public void onstop() 33.super.onstop(); 34.savesharedpreferences(); 35. 36. 37.private void loadsharedpreferences() 38. sharedpreferences sharedpreferences = getsharedpreferences(preference_name, mode); 39.string name = shar
16、edpreferences.getstring(name,tom); 40.int age = sharedpreferences.getint(age, 20); 41.float height = sharedpreferences.getfloat(height,); 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 42. 43. nametext.settext(name); 44.agetext.settext(string.valueof(age); 45.heighttext.settext(string.valueof(height); 46. 47. 48. private void
17、savesharedpreferences() 49.sharedpreferences sharedpreferences = getsharedpreferences(preference_name, mode); 50.sharedpreferences.editor editor = sharedpreferences.edit(); 51. 52.editor.putstring(name, nametext.gettext().tostring(); 53.editor.putint(age, integer.parseint(agetext.gettext().tostring(
18、); 54.editor.putfloat(height, float.parsefloat(heighttext.gettext().tostring(); mit(); 56. 57. 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 q示例sharepreferencedemo將說明如何讀取其他應(yīng)用 程序保存的sharedpreferences數(shù)據(jù) q下圖是sharepreferencedemo示例的用戶界面 q示例將讀取simplepreferencedemo示例保存的信息, 并在程序啟動(dòng)時(shí)顯示在用戶界面上 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 q下面給出sharepreferencedemo示例
19、的核心代碼 1.public static final string preference_package = edu.hrbeu.simplepreferencedemo; 2.public static final string preference_name = savesetting; 3.public static int mode = context.mode_world_readable + context.mode_world_writeable; 4. 5.public void oncreate(bundle savedinstancestate) 6.context c
20、= null; 7.try 8.c = this.createpackagecontext(preference_package, context.context_ignore_security); 9. catch (namenotfoundexception e) 10.e.printstacktrace(); 11. 12.sharedpreferences sharedpreferences = c.getsharedpreferences(preference_name, mode); 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 n第8行代碼調(diào)用了createpackagecontext(
21、)獲取到了 simplepreferencedemo示例的context n第8行代碼第1個(gè)參數(shù)是simplepreferencedemo的包名稱 ,在代碼第1行進(jìn)行了定義 n第2個(gè)參數(shù)context.context_ignore_securit表示 忽略所有可能產(chǎn)生的安全問題。這段代碼可能引發(fā)異常, 因此必須防止在try/catch中 13. string name = sharedpreferences.getstring(name,tom); 14.int age = sharedpreferences.getint(age, 20); 15.float height = sharedp
22、references.getfloat(height,); 16. 8.1 簡(jiǎn)單存儲(chǔ) n8.1.2 示例 n在代碼第12行,通過context得到了 simplepreferencedemo示例的sharedpreferences對(duì)象 ,同樣在getsharedpreferences()函數(shù)中,需要將正確的 sharedpreferences名稱傳遞給函數(shù) q訪問其他應(yīng)用程序的sharedpreferences必須滿足三個(gè) 條件 n共享者需要將sharedpreferences的訪問模式設(shè)置為全局 讀或全局寫 n訪問者需要知道共享者的包名稱和sharedpreferences的 名稱,以通過c
23、ontext獲得sharedpreferences對(duì)象 n訪問者需要確切知道每個(gè)數(shù)據(jù)的名稱和數(shù)據(jù)類型,用以正 確讀取數(shù)據(jù) 8.2 文件存儲(chǔ) nandroid使用的是基于linux的文件系統(tǒng),程序 開發(fā)人員可以建立和訪問程序自身的私有文件 ,也可以訪問保存在資源目錄中的原始文件和 xml文件,還可以在sd卡等外部存儲(chǔ)設(shè)備中 保存文件 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) q android系統(tǒng)允許應(yīng)用程序創(chuàng)建僅能夠自身訪問的私有 文件,文件保存在設(shè)備的內(nèi)部存儲(chǔ)器上,在linux系統(tǒng) 下的/data/data/files目錄中 qandroid系統(tǒng)不僅支持標(biāo)準(zhǔn)java的io類和方法,還提供 了
24、能夠簡(jiǎn)化讀寫流式文件過程的函數(shù) q主要介紹的兩個(gè)函數(shù) nopenfileoutput() nopenfileinput() 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qopenfileoutput()函數(shù) nopenfileoutput()函數(shù)為寫入數(shù)據(jù)做準(zhǔn)備而打開的應(yīng)用程 序私文件,如果指定的文件不存在,則創(chuàng)建一個(gè)新的文件 nopenfileoutput()函數(shù)的語法格式如下 q第1個(gè)參數(shù)是文件名稱,這個(gè)參數(shù)不可以包含描述路徑的斜 杠 q第2個(gè)參數(shù)是操作模式 n函數(shù)的返回值是fileoutputstream類型 public fileoutputstream openfileoutput(s
25、tring name, int mode) 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qopenfileoutput()函數(shù) nandroid系統(tǒng)支持四種文件操作模式 模式模式說明說明 mode_private私有模式,缺陷模式,文件僅能 夠被文件創(chuàng)建程序訪問,或具有 相同uid的程序訪問。 mode_append追加模式,如果文件已經(jīng)存在, 則在文件的結(jié)尾處添加新數(shù)據(jù)。 mode_world_readable全局讀模式,允許任何程序讀取 私有文件。 mode_world_writeable全局寫模式,允許任何程序?qū)懭?私有文件。 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qopenfileo
26、utput()函數(shù) n使用openfileoutput()函數(shù)建立新文件的示例代碼如下 q第1行代碼定義了建立文件的名稱filedemo.txt q第2行代碼使用openfileoutput()函數(shù)以私有模式建立文件 q第4行代碼調(diào)用write()函數(shù)將數(shù)據(jù)寫入文件 q第5行代碼調(diào)用flush()函數(shù)將所有剩余的數(shù)據(jù)寫入文件 q第6行代碼調(diào)用close()函數(shù)關(guān)閉fileoutputstream 1.string file_name = filedemo.txt; 2.fileoutputstream fos = openfileoutput(file_name,context.mode_pr
27、ivate) 3.string text = “some data”; 4.fos.write(text.getbytes(); 5.fos.flush(); 6.fos.close(); 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qopenfileoutput()函數(shù) n為了提高文件系統(tǒng)的性能,一般調(diào)用write()函數(shù)時(shí),如果 寫入的數(shù)據(jù)量較小,系統(tǒng)會(huì)把數(shù)據(jù)保存在數(shù)據(jù)緩沖區(qū)中, 等數(shù)據(jù)量累積到一定程度時(shí)再一次性的寫入文件中 n由上可知,在調(diào)用close()函數(shù)關(guān)閉文件前,務(wù)必要調(diào)用 flush()函數(shù),將緩沖區(qū)內(nèi)所有的數(shù)據(jù)寫入文件 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qopenfil
28、einput()函數(shù) nopenfileinput()函數(shù)為讀取數(shù)據(jù)做準(zhǔn)備而打開應(yīng)用程序私 文件 nopenfileinput()函數(shù)的語法格式如下 q第1個(gè)參數(shù)也是文件名稱,同樣不允許包含描述路徑的斜杠 public fileinputstream openfileinput (string name) 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qopenfileinput()函數(shù) n使用openfileinput ()函數(shù)打開已有文件的示例代碼如下 n上面的兩部分代碼在實(shí)際使用過程中會(huì)遇到錯(cuò)誤提示,因 為文件操作可能會(huì)遇到各種問題而最終導(dǎo)致操作失敗,因 此代碼應(yīng)該使用try/catch捕獲
29、可能產(chǎn)生的異常 1.string file_name = filedemo.txt; 2.fileinputstream fis = openfileinput(file_name); 3. 4.byte readbytes = new bytefis.available(); 5.while(fis.read(readbytes) != -1) 6. 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qinternalfiledemo示例用來演示在內(nèi)部存儲(chǔ)器上進(jìn)行文 件寫入和讀取 qinternalfiledemo示例用戶界面如圖 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qinternalfile
30、demo示例的核心代碼 1.onclicklistener writebuttonlistener = new onclicklistener() 2.override 3.public void onclick(view v) 4.fileoutputstream fos = null; 5.try 6. if (appendbox.ischecked() 7. fos = openfileoutput(file_name,context.mode_append); 8. else 9. fos = openfileoutput(file_name,context.mode_private)
31、; 10. 11.string text = entrytext.gettext().tostring(); 12.fos.write(text.getbytes(); 13.labelview.settext(文件寫入成功,寫入長(zhǎng)度:+text.length(); 14.entrytext.settext(); 15. catch (filenotfoundexception e) 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) 16. e.printstacktrace(); 17. 18.catch (ioexception e) 19.e.printstacktrace(); 20. 21.
32、finally 22.if (fos != null) 23.try 24.fos.flush(); 25.fos.close(); 26. catch (ioexception e) 27.e.printstacktrace(); 28. 29. 30. 31. 32. ; 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) 33.onclicklistener readbuttonlistener = new onclicklistener() 34. override 35. public void onclick(view v) 36. displayview.settext(); 37. fi
33、leinputstream fis = null; 38. try 39. fis = openfileinput(file_name); 40. if (fis.available() = 0) 41. return; 42. 43. byte readbytes = new bytefis.available(); 44. while(fis.read(readbytes) != -1) 45. 46. string text = new string(readbytes); 47. displayview.settext(text); 48. labelview.settext(文件讀取
34、成功,文件長(zhǎng)度:+text.length(); 49. catch (filenotfoundexception e) 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) q程序運(yùn)行后,在 /data/data/edu.hrbeu.internalfiledemo/files/目錄下, 找到了新建立的filedemo.txt文件 50. e.printstacktrace(); 51. 52.catch (ioexception e) 53.e.printstacktrace(); 54. 55. 56. ; 8.2 文件存儲(chǔ) n8.2.1 內(nèi)部存儲(chǔ) qfiledemo.txt文件 nfiledemo.
35、txt從文件權(quán)限上進(jìn)行分析,“-rw-rw-”表明文 件僅允許文件創(chuàng)建者和同組用戶讀寫,其他用戶無權(quán)使用 n文件的大小為9個(gè)字節(jié),保存的數(shù)據(jù)為“some data” 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) qandroid的外部存儲(chǔ)設(shè)備指的是sd卡(secure digital memory card),是一種廣泛使用于數(shù)碼設(shè)備上的記憶 卡 q不是所有的android手機(jī)都有sd卡,但android系統(tǒng)提 供了對(duì)sd卡的便捷的訪問方法 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) qsd卡適用于保存大尺寸的文件或者是一些無需設(shè)置訪 問權(quán)限的文件,可以保存錄制的大容量的視頻文件和音 頻文件等 qs
36、d卡使用的是fat(file allocation table)的文件系 統(tǒng),不支持訪問模式和權(quán)限控制,但可以通過linux文 件系統(tǒng)的文件訪問權(quán)限的控制保證文件的私密性 qandroid模擬器支持sd卡,但模擬器中沒有缺省的sd 卡,開發(fā)人員須在模擬器中手工添加sd卡的映像文件 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) q使用/tools目錄下的mksdcard工具創(chuàng)建 sd卡映像文件,命令如下 n第1個(gè)參數(shù)-1表示后面的字符串是sd卡的標(biāo)簽,這個(gè)新建 立的sd卡的標(biāo)簽是sdcard n第2個(gè)參數(shù)256m表示sd卡的容量是256兆 n最后一個(gè)參數(shù)表示sd卡映像文件的保存位置,上面的命 令將映
37、像保存在e:android目錄下sdcard_file文件中。在 cmd中執(zhí)行該命令后,則可在所指定的目錄中找到生產(chǎn) 的sd卡映像文件 mksdcard -l sdcard e:androidsdcard_file 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) q如果希望android模擬器啟動(dòng)時(shí)能夠自動(dòng)加載指定的sd 卡,還需要在模擬器的“運(yùn)行設(shè)置”(run configurations)中添加sd卡加載命令 qsd卡加載命令中只要指明映像文件位置即可 qsd卡加載命令 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) q測(cè)試sd卡映像是否正確加載 q在模擬器啟動(dòng)后,使用fileexplorer向sd卡
38、中隨意上傳 一個(gè)文件,如果文件上傳成功,則表明sd卡映像已經(jīng) 成功加載 q向sd卡中成功上傳了一個(gè)測(cè)試文件test.txt,文件顯示 在/sdcard目錄下 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) q編程訪問sd卡 n首先需要檢測(cè)系統(tǒng)的/sdcard目錄是否可用 n如果不可用,則說明設(shè)備中的sd卡已經(jīng)被移除,在 android模擬器則表明sd卡映像沒有被正確加載 n如果可用,則直接通過使用標(biāo)準(zhǔn)的java.io.file類進(jìn)行訪問 q將數(shù)據(jù)保存在sd卡 n通過“生產(chǎn)隨機(jī)數(shù)列”按鈕生產(chǎn)10個(gè)隨機(jī)小數(shù) n通過“寫入sd卡”按鈕將生產(chǎn)的數(shù)據(jù)保存在sd卡的目錄 下 nsdcardfiledemo示例說
39、明了如何將數(shù)據(jù)保存在sd卡 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) q下圖是sdcardfiledemo示例的用戶界面 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) qsdcardfiledemo示例運(yùn)行后,在每次點(diǎn)擊“寫入sd卡 ”按鈕后,都會(huì)在sd卡中生產(chǎn)一個(gè)新文件,文件名各 不相同 qsd卡中生產(chǎn)的文件 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) qsdcardfiledemo示例與internalfiledemo示例的核心 代碼比較相似 qsdcardfiledemo示例與internalfiledemo示例的不同 之處 n第7行代碼中添加了/sdcard目錄存在性檢查 n第8行代碼使用“
40、絕對(duì)目錄+文件名”的形式表示新建立的 文件 n第12行代碼寫入文件前對(duì)文件存在性和可寫入性進(jìn)行檢查 n第5行代碼為了保證在sd卡中多次寫入時(shí)文件名不會(huì)重復(fù) ,在文件名中使用了唯一且不重復(fù)的標(biāo)識(shí),這個(gè)標(biāo)識(shí)通過 調(diào)用system.currenttimemillis()函數(shù)獲得,表示從1970年 00:00:00到當(dāng)前所經(jīng)過的毫秒數(shù) 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) q下面是sdcardfiledemo示例的核心代碼 1.private static string randomnumbersstring = ; 2.onclicklistener writebuttonlistener =
41、new onclicklistener() 3.override 4.public void onclick(view v) 5.string filename = sdcardfile-+system.currenttimemillis()+.txt; 6.file dir = new file(/sdcard/); 7.if (dir.exists() 9. fileoutputstream fos = null; 10. try 11. newfile.createnewfile(); 12. if (newfile.exists() 14. fos.write(randomnumber
42、sstring.getbytes(); 8.2 文件存儲(chǔ) n8.2.2 外部存儲(chǔ) 15. textview labelview = (textview)findviewbyid(r.id.label); 16.labelview.settext(filename + 文件寫入sd卡); 17. 18. catch (ioexception e) 19. e.printstacktrace(); 20. finally 21. if (fos != null) 22.try 23. fos.flush(); 24. fos.close(); 25. 26.catch (ioexception e
43、) 27. 28. 29. 30. 31. ; 8.2 文件存儲(chǔ) n8.2.3 資源文件 q程序開發(fā)人員可以將程序開發(fā)階段已經(jīng)準(zhǔn)備好的原始格 式文件和xml文件分別存放在/res/raw和/res/xml目錄下 ,供應(yīng)用程序在運(yùn)行時(shí)進(jìn)行訪問 q原始格式文件可以是任何格式的文件,例如視頻格式文 件、音頻格式文件、圖像文件和數(shù)據(jù)文件等等,在應(yīng)用 程序編譯和打包時(shí),/res/raw目錄下的所有文件都會(huì)保 留原有格式不變 q/res/xml目錄下的xml文件,一般用來保存格式化的數(shù) 據(jù),在應(yīng)用程序編譯和打包時(shí)會(huì)將xml文件轉(zhuǎn)換為高效 的二進(jìn)制格式,應(yīng)用程序運(yùn)行時(shí)會(huì)以特殊的方式進(jìn)行訪 問 8.2 文件存
44、儲(chǔ) n8.2.3 資源文件 qresourcefiledemo示例演示了如何在程序運(yùn)行時(shí)訪問 資源文件 q當(dāng)用戶點(diǎn)擊“讀取原始文件”按鈕時(shí),程序?qū)⒆x取 /res/raw/raw_file.txt文件,并將內(nèi)容顯示在界面上 8.2 文件存儲(chǔ) n8.2.3 資源文件 q當(dāng)用戶點(diǎn)擊“讀取xml文件”按鈕時(shí),程序?qū)⒆x取 /res/xml/people.xml文件,并將內(nèi)容顯示在界面上 8.2 文件存儲(chǔ) n8.2.3 資源文件 q讀取原始格式文件,首先需要調(diào)用getresource()函數(shù) 獲得資源對(duì)象,然后通過調(diào)用資源對(duì)象的 openrawresource()函數(shù),以二進(jìn)制流的形式打開指定 的原始格式
45、文件。在讀取文件結(jié)束后,調(diào)用close()函數(shù) 關(guān)閉文件流 qresourcefiledemo示例中關(guān)于讀取原始格式文件的核 心代碼如下 1.resources resources = this.getresources(); 2.inputstream inputstream = null; 3.try 4.inputstream = resources.openrawresource(r.raw.raw_file); 5.byte reader = new byteinputstream.available(); 6.while (inputstream.read(reader) != -
46、1) 7. 8.2 文件存儲(chǔ) n8.2.3 資源文件 n代碼第8行的new string(reader,utf-8),表示以u(píng)tf-8的 編碼方式,從字節(jié)數(shù)組中實(shí)例化一個(gè)字符串 q程序開發(fā)人員需要確定/res/raw/raw_file.txt文件使用的 是utf-8編碼方式,否則程序運(yùn)行時(shí)會(huì)產(chǎn)生亂碼 8. displayview.settext(new string(reader,utf-8); 9. catch (ioexception e) 10.log.e(resourcefiledemo, e.getmessage(), e); 11. finally 12.if (inputstre
47、am != null) 13.try 14.inputstream.close(); 15. 16.catch (ioexception e) 17. 18. 8.2 文件存儲(chǔ) n8.2.3 資源文件 q確認(rèn)的方法 n右擊raw_file.txt文件 n選擇“properties”打開raw_file.txt文件的屬性設(shè)置框 n在resource欄下的text file encoding中,選擇“other: utf-8” 8.2 文件存儲(chǔ) n8.2.3 資源文件 q/res/xml目錄下的xml文件會(huì)轉(zhuǎn)換為一種高效的二進(jìn)制 格式 q說明如何在程序運(yùn)行時(shí)讀取/res/xml目錄下的xml文件
48、n首先在/res/xml目錄下創(chuàng)建一個(gè)名為people.xml的文件 nxml文件定義了多個(gè)元素,每個(gè)元素 都包含三個(gè)屬性name、age和height,分別表示姓名、年 齡和身高 q/res/xml/people.xml文件代碼如下 1. 2. 3. 4. 5. 8.2 文件存儲(chǔ) n8.2.3 資源文件 q讀取xml格式文件 n首先通過調(diào)用資源對(duì)象的getxml()函數(shù),獲取到xml解析 器xmlpullparser nxmlpullparser是android平臺(tái)標(biāo)準(zhǔn)的xml解析器,這項(xiàng)技 術(shù)來自一個(gè)開源的xml解析api項(xiàng)目xmlpull qresourcefiledemo示例中關(guān)于讀取
49、xml文件的核心代 碼如下 1.xmlpullparser parser = resources.getxml(r.xml.people); 2.string msg = ; 3.try 4.while (parser.next() != xmlpullparser.end_document) 5.string people = parser.getname(); 6.string name = null; 8.2 文件存儲(chǔ) n8.2.3 資源文件 7. string age = null; 8.string height = null; 9.if (people != null) 11. f
50、or (int i = 0; i 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q在啟動(dòng)sqlite3工具后,提示符從“#”變?yōu)椤皊qlite” ,表示命令行界面進(jìn)入與sqlite數(shù)據(jù)庫的交互模式,此 時(shí)可以輸入命令建立、刪除或修改數(shù)據(jù)庫的內(nèi)容 q正確退出sqlite3工具的方法是使用.exit命令 q原則上,每個(gè)應(yīng)用程序的數(shù)據(jù)庫都保存在各自的 /data/data/databases目錄下,但如 果使用手工方式建立數(shù)據(jù)庫,則必須手工建立數(shù)據(jù)庫目 錄,目前版本無須修改數(shù)據(jù)庫目錄的權(quán)限 1.sqlite .exit 2.# 1.# mkdir databases 2.# ls l 3.drwxrw
51、xrwx root root 2009-07-18 15:43 databases 4.drwxr-xr-x system system 2009-07-18 15:31 lib 5.# 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q在sqlite數(shù)據(jù)庫中,每個(gè)數(shù)據(jù)庫保存在一個(gè)獨(dú)立的文件 中,使用sqlite3工具后加文件名的方式打開數(shù)據(jù)庫文件 ,如果指定文件不存在,sqlite3工具則自動(dòng)創(chuàng)建新文件 q下面的代碼將創(chuàng)建名為people的數(shù)據(jù)庫,在文件系統(tǒng)中 將產(chǎn)生一個(gè)名為people.db的數(shù)據(jù)庫文件 1.# sqlite3 people.db 2.sqlite version 3.ente
52、r “.help” for instructions 4.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q下面的代碼在新創(chuàng)建的數(shù)據(jù)庫中,構(gòu)造了一個(gè)名為 peopleinfo的表,使用create table命令,關(guān)系模式為 peopleinfo ( _id, name, age, height) q表包含四個(gè)屬性,_id是整型的主鍵;name表示姓名, 字符型,not null表示這個(gè)屬性一定要填寫,不可以為 空值;age表示年齡,整數(shù)型;height表示身高,浮點(diǎn) 型 1.sqlite create table peopleinfo 2. (_id integer primary
53、 key autoincrement, 3. name text not null, 4. age integer, 5. height float); 6.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q為了確認(rèn)數(shù)據(jù)表是否創(chuàng)建成功,可以使用.tables命令, 顯示當(dāng)前數(shù)據(jù)庫中的所有表 q從下面的代碼中可以觀察到,當(dāng)前數(shù)據(jù)庫僅有一個(gè)名為 peopleinfo的表 q當(dāng)然,也可以使用.schema命令查看建立表時(shí)使用的 sql命令。如果當(dāng)前數(shù)據(jù)庫中包含多個(gè)表,則可以使用 .schema 表名的形式,顯示指定表的建立命令 1.sqlite .tables 2.poepleinfo 3
54、.sqlite 1.sqlite.schema 2.create table peopleinfo (_id integer primary key autoincrement, 3.name text not null, age integer, height float); 4.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q向peopleinfo表中添加數(shù)據(jù),使用insert into values 命令 q代碼運(yùn)行成功后,數(shù)據(jù)庫的peopleinfo表將有三條數(shù)據(jù) 。因?yàn)開id是自增加的主鍵,因此在輸入null后,sqlite 數(shù)據(jù)庫會(huì)自動(dòng)填寫該項(xiàng)的內(nèi)容 1.sqlite
55、insert into peopleinfo values(null,tom,21,1.81); 2.sqlite insert into peopleinfo values(null,jim,22,1.78); 3.sqlite insert into peopleinfo values(null,lily,19,1.68); _id_idnamenameageageheightheight 1tom211.81 2jim221.78 3lily191.68 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q在數(shù)據(jù)添加完畢后,使用select命令,顯示指定數(shù)據(jù)表 中的所有數(shù)據(jù)信息,命令格式為se
56、lect 屬性 from 表名 q下面的代碼用來顯示peopleinfo表的所有數(shù)據(jù) 1.select * from peopleinfo; 2.1|tom|21|1.81 3.2|jim|22|1.78 4.3|lily|19|1.68 5.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q上面的查詢結(jié)果看起來不是非常直觀,可以使用mode 命令將結(jié)果輸出格式更改為“表格”方式 qmode命令除了支持常見的column格式為,還支持csv 格式、html格式、insert格式、line格式、list格式、tabs 格式和tcl格式 1.sqlite .mode column 2.s
57、qlite select * from peopleinfo; 3.1 tom 21 1.81 4.2 jim 22 1.78 5.3 lily 19 1.68 6.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q更新數(shù)據(jù)可以使用update命令,命令格式為update 表 名 set 屬性=“新值” where 條件 q更新數(shù)據(jù)后,同樣使用select命令顯示數(shù)據(jù),則可以確 定數(shù)據(jù)是否正確更新 q下面的代碼將姓名為lily數(shù)據(jù)中的高度值更新為1.88 1.sqlite update peopleinfo set height=1.88 where name=lily; 2.sql
58、ite select * from peopleinfo; 3.select * from peopleinfo; 4.1 tom 21 1.81 5.2 jim 22 1.78 6.3 lily 19 1.88 7.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 q刪除數(shù)據(jù)可以使用delete命令,命令格式為delete from 表名where 條件 q下面的代碼將_id為3數(shù)據(jù)從表peopleinfo中刪除 1.sqlite delete from peopleinfo where _id=3; 2.sqlite select * from peopleinfo; 3.sele
59、ct * from peopleinfo; 4.1 tom 21 1.81 5.2 jim 22 1.78 6.sqlite 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 qsqlite3工具還支持大量的命令,可以使用.help命令查詢 sqlite3的命令列表 編號(hào)編號(hào)命令命令說明說明 1.bail on|off遇到錯(cuò)誤時(shí)停止,缺省為off 2.databases顯示數(shù)據(jù)庫名稱和文件位置 3.dump ?table? . 將數(shù)據(jù)庫以sql文本形式導(dǎo)出 4.echo on|off 開啟和關(guān)閉回顯 5.exit退出 6.explain on|off開啟或關(guān)閉適當(dāng)輸出模式,如果開啟模 式將更改為co
60、lumn,并自動(dòng)設(shè)置寬度 8.3 數(shù)據(jù)庫存儲(chǔ) n8.3.2 手動(dòng)建庫 編號(hào)編號(hào)命令命令說明說明 7.header(s) on|off開啟或關(guān)閉標(biāo)題顯示 8.help顯示幫助信息 9.import file table將數(shù)據(jù)從文件導(dǎo)入表中 10.indices table顯示表中所的列名 11.load file ?entry?導(dǎo)入擴(kuò)展庫 12.mode mode ?table?設(shè)置輸入格式 13.nullvalue string打印時(shí)使用string代替null 14.output filename將輸入保存到文件 15.output stdout 將輸入顯示在屏幕上 16. p r o m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年新興科技產(chǎn)業(yè)投資分析咨詢服務(wù)合同模板3篇
- 二零二五年度時(shí)尚服飾LOGO設(shè)計(jì)作品轉(zhuǎn)讓合同協(xié)議3篇
- 2024版次新房交易合同3篇
- 二零二五年度離婚協(xié)議按揭房產(chǎn)分割范本制作
- 二零二五年生物制藥廠勞務(wù)承包與藥品研發(fā)合同3篇
- 西安音樂學(xué)院《材料科學(xué)基礎(chǔ)雙語》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024版板材購銷合同標(biāo)準(zhǔn)范文
- 二零二五年度貨車車輛買賣與綠色物流推廣合同3篇
- 2024電商公司帶貨合同范本
- 二零二五版城市更新項(xiàng)目開發(fā)委托管理及規(guī)劃設(shè)計(jì)服務(wù)協(xié)議3篇
- 【自考練習(xí)題】大連交通大學(xué)概率論與數(shù)理統(tǒng)計(jì)真題匯總(附答案解析)
- 布袋除塵器分部分項(xiàng)驗(yàn)收記錄表完整
- 新編劍橋商務(wù)英語(初級(jí))學(xué)生用書-答案
- 公路工程質(zhì)量鑒定辦法
- 水果購銷合同模板(精選5篇)
- 板框壓濾機(jī)方案具體方案模板
- 鉆探工程編錄方法課件
- 奧運(yùn)會(huì)獎(jiǎng)牌榜預(yù)測(cè)問題
- 物理奧賽:力學(xué)物體的平衡31-優(yōu)質(zhì)課件
- CJ-T-314-2009-城鎮(zhèn)污水處理廠污泥處置-水泥熟料生產(chǎn)用泥質(zhì)
- 中小學(xué)生志愿服務(wù)記錄表、評(píng)定表
評(píng)論
0/150
提交評(píng)論