



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)存儲的幾種方式總體的來講,數(shù)據(jù)存儲方式有三種:一個是文件,一個是數(shù)據(jù)庫,另一個則是網(wǎng)絡(luò)。其 中文件和數(shù)據(jù)庫可能用的稍多一些,文件用起來較為方便,程序可以自己定義格式;數(shù)據(jù)庫用起稍煩鎖一些,但它有它的優(yōu)點,比如在海量數(shù)據(jù)時性能優(yōu)越,有查詢功能,可以加密, 可以加鎖,可以跨應用,跨平臺等等;網(wǎng)絡(luò),則用于比較重要的事情,比如科研,勘探,航 空等實時采集到的數(shù)據(jù)需要馬上通過網(wǎng)絡(luò)傳輸?shù)綌?shù)據(jù)處理中心進行存儲并進行處理。對于An droid平臺來講,它的存儲方式也不外乎這幾種,按方式總體來分,也是文件,數(shù)據(jù)庫和 網(wǎng)絡(luò)。但從開發(fā)者的角度來講它可以分為以下五種方式:I.SharedPreferences共享
2、偏好2.1 nternal Storage 內(nèi)部存儲空間 3.External Storage 外部存儲空間 4.SQLite Database數(shù)據(jù)庫5.1 nternet網(wǎng)絡(luò) 這幾種方式各自有各自的優(yōu)點和缺點,要根據(jù)不同的實際情況來選擇,而無法給出統(tǒng)一的標準。下面就各種方式談?wù)勊鼈兊膬?yōu)缺點,以及最合適的使用情況:1.SharedPreferences共享偏好 SharedPreferences是用來存儲一些 Key/Value類似的成對的基本數(shù)據(jù)類型,注意,它只能存儲基本數(shù)據(jù)類型,也即int, long, boolean, String, float。事實上它完全相當于一個 HashMap,
3、唯一不同的就是 HashMap中的 Value可以是任何 對象,而 SharedPreferences中的值只能存儲基本數(shù)據(jù)類型(primitive types)。對于它的使用方法, 可以參考An droid Developer Guide,這里不重復。如此來看,最適合 SharedPrefere nces的地方就是保存配置信息,因為 很多配置信息都是 Key/Value。事實上,在 An droid當中 SharedPreferences使用最多的地方也是用來保存配置(Settings)信息,系統(tǒng)中的 Settings中這樣,各個應用中的 Sett ings也是這樣。并且,An droid中
4、為了方便的使用 SharedPrefere nces 保存配置信息,它來專門有PreferenceActivity用來封裝。也就是說如果你想在應用程序中創(chuàng) 建配置(Settings),你可以直接使用PreferenceActivity和一些相關(guān)的專門為 Preferenee圭寸裝的組件,而不用再直接去創(chuàng)建,讀取和保存SharedPreferenee, Framework中的這些組件會為你做這些事。再談?wù)勔恍┦褂?SharedPrefere nee時的技巧,它只能保存基本數(shù)據(jù)類型,但假如我想保存一個數(shù)組,怎么辦?可以把數(shù)據(jù)進行處理,把它轉(zhuǎn)化成一個String,取出的時候再還原就好了;再如,如想保
5、存一個對象,怎么辦,同樣,可以把對象序列化成為字符序 列,或轉(zhuǎn)成 String( Object.toString(),或是把它的 HashCode (Object.hashCode()當成 Value 保存進去??傊琒haredPreferences使用起來十分的方便,可以靈活應用,因為它簡單方 便,所以能用它就盡量不要用文件或是數(shù)據(jù)庫。1.1 nternal Storage內(nèi)部存儲空間 所謂的內(nèi)部存儲與外部存儲,是指是否是手機內(nèi)置。手機內(nèi)置的存儲空間,稱為內(nèi)部存儲,它是手機一旦出廠就無法改變,它也是手機的硬件指標之一,通常來講手機內(nèi)置存儲空間越大意味著 手機價格會越貴(很多地方把它稱為手機
6、內(nèi)存,但我們做軟件的知道,這并不準確,內(nèi)存是 指手機運行時存儲程序,數(shù)據(jù)和指令的地方;這里應該是手機內(nèi)部存儲的簡稱為內(nèi)存,而并非嚴格意義上的內(nèi)存)。內(nèi)部存儲空間十分有限,因而顯得可貴,所以我們要盡可能避免使 用;另外,它也是系統(tǒng)本身和系統(tǒng)應用程序主要的數(shù)據(jù)存儲所在地,一旦內(nèi)部存儲空間耗盡,手機也就無法使用了。所以對于內(nèi)部存儲空間,我們要盡量避免使用。上面所談到的SharedPrefere nces和下面要談到的 SQLite數(shù)據(jù)庫也都是存儲在內(nèi)部存儲空間上的。An droid本身來講是一個 Linux操作系統(tǒng),所以它的內(nèi)部存儲空間,對于應用程序和用戶來講就是“/data/data"目
7、錄。它與其他的(外部的存儲)相比有著比較穩(wěn)定,存儲方便,操作簡單, 更加安全(因為可以控制訪問權(quán)限)等優(yōu)點。而它唯一的缺點就是它比較有限,比較可貴。 雖然,可以非常容易的知道程序本身的數(shù)據(jù)所在路徑,所有的應用程序的數(shù)據(jù)路徑都是“/data/data/app-package-name/',所有的程序用到的數(shù)據(jù),比如libs 庫,SharedPreferences都是存放在這個路徑下面。但我們在使用的時候最好不要,或是千萬不要直接引用這個路徑。使用內(nèi)部存儲主要有二個方式,一個是文件操作,一個是文件夾操作。無論哪種方式,Con text中都提供了相應的函數(shù)來支持,使用Con text不但操作
8、簡單方便,最重要的是Con text會幫助我們管理這些文件,也可以方便幫助我們控制文件的訪問權(quán)限。先來系統(tǒng)的說下Con text中關(guān)于文件和文件夾操作的函數(shù)有哪些。a.創(chuàng)建一個文件,并打開成一個文件輸出流,需要提供一個 String ,作為文件名I.FileOutputStream output = Context.openOutputFile(filename ,Context.MODE_PRIV ATE); 2.output.write(data); / use output to write whatever you like 3.output.close(); 1.FileOutput
9、Stream output =Con text.ope nO utputFile(file name,Context.MODE_PRIV ATE); output.write(data); / use output to write whatever you like output.close(); b.同樣,想打開一個文件作為輸入的話,也是只需要提供文件名 1.File In putStream in put = Con text.ope nln putFile(file name);2.i nput.read(); 3.i nput.close();1.File In putStream
10、in put = Con text.ope nln putFile(file name); in put.read(); in put.close(); c.歹 U出所有的已創(chuàng)建的文件1.String files = Context.fileList(); 2.for (String file : files) 3. Log.e(TAG ,"file is " + file); 4. 1.String files = Context.fileList(); for (String file : files) Log.e(TAG, "fileis " +
11、file); d.刪除文件,能創(chuàng)建就要能夠刪除,當然也會提供了刪除文件的接口,它也非 常簡單,只需要提供文件名1.if (Co ntext.deleteFile(file name) 2. Log.e(TAG , "delete file " +file name + " sucessfully "); 3. else 4. Log.e(TAG , "failed to delete file " + file name); 5. 1.if (Con text.deleteFile(file name) Log.e(TAG, &quo
12、t;delete file " + file name + " sucessfully "); else Log.e(TAG, "failed to delete file " + file name); e.獲取文件已創(chuàng)建文件的路徑,它返回一個文件對象用于操作路徑1.File fileDir = Context.getFileDir(); 2.Log.e(TAG, "fileDir " +fileDir.getAbsolutePath(); 1.File fileDir = Con text.getFileDir();Lo
13、g.e(TAG, "fileDir " +fileDir.getAbsolutePath(); f.創(chuàng)建一個目錄,需要傳入目錄名稱,它返回一個文件對象用到操作路徑 1.File workDir = Context.getDir(dirName, Context.MODE_PRIVATE); 2.Log.e(TAG ,"workdir "+ workDir.getAbsolutePath(); 1.File workDir = Co ntext.getDir(dirName,Context.MODE_PRIV ATE); Log.e(TAG , "
14、;workdir " + workDir.getAbsolutePath(); g. 以 File 對象 方式查看所創(chuàng)建文件,需要傳入文件名,會返回文件對象 1.File store =Context.openFileStreamPath(filename); 2.Log.e(TAG, "store " + store.length(); 1.File store = Context.openFileStreamPath(filename); Log.e(TAG, "store " + store.length(); h.獲取 Cache 路
15、徑,無需要傳入?yún)?shù),返回文件對象1.File cachedir = Context.getCacheDir(); 2.Log.e(TAG ,"cachedir " + cacheDir.getAbsolutePath(); 1.File cachedir = Con text.getCacheDir(); Log.e(TAG, "cachedir " + cacheDir.getAbsolutePath();總結(jié)一下文件相關(guān)操作,可以得出以下三個特點:1.文件操作只需要向函數(shù)提供文件名,所以程序自己只需要維護文件名即可;2.不用自己去創(chuàng)建文件對象和輸入、
16、輸出流,提供文件名就可以返回File對象或輸入輸出流3.對于路徑操作返回的都是文件對象。如前所述,內(nèi)部存儲空間有限,可貴,安全,穩(wěn)定,所以應該用來保存比較重要的數(shù)據(jù),比如用戶信息資料,口令秘碼等不需要與其他應用程序共享的數(shù)據(jù)。也可以用來創(chuàng)建臨時文件,但一定要注意及時刪除。另外,對于內(nèi)部存儲還有一個非常重要的特點,那就是在應用程序被卸載時,應用程序在內(nèi)部存儲空間的文件數(shù)據(jù)將全部被 刪除。系統(tǒng)這樣做的原因很簡單,就是因為內(nèi)部存儲很有限,它必須保證它的可用性,因為一旦添滿,系統(tǒng)將無法再正常工作。1.External Storage外部存儲空間再來談?wù)勈謾C外部存儲空間,與內(nèi)部存儲空間相對,外部存儲空間
17、是指手機出廠的時候不存在,用戶在使用時候可以自由添加的外部存儲介質(zhì)比如TS卡,SD卡等閃存儲介質(zhì)。這些閃存介質(zhì)由最初的空間小價格貴,到現(xiàn)在的大容量價格便宜,所以幾乎每個支持外部存儲的手機上面都有大容量(大于等于2G)的閃存卡。An droid也是不例外,它完全支持外部存儲介質(zhì)。其實更確切的說,它是要依賴于外部存儲卡的,因為對于An droid系統(tǒng),如果沒有外部存儲卡,很多的系統(tǒng)應用無法使用,比如多媒體相關(guān)的應用程序無法使用。雖然An droid很依賴,但是外部存儲卡也有它自身的特點,它最大的優(yōu)點就是存儲空間大,基本上你可無限制的使用, 也不怎么擔心去清除數(shù)據(jù)。就目前來看,很多程序都在使用外部存
18、儲卡,但很少有程序去主動清理數(shù)據(jù),所以無論你的SD卡有多大,它的可用空間卻越來越少。與內(nèi)部存儲不同的是,當程序卸載時,它在外部存儲所創(chuàng)建的文件數(shù)據(jù)是不會被清除的。所以清理外部存儲空間的責任丟給了用戶自己,每隔一段時間就去查看下SD卡,發(fā)現(xiàn)無用數(shù)據(jù)立馬刪除。外部存儲的缺點就是不是很穩(wěn)定,對于An droid手機來講可以說,很不穩(wěn)定,本身閃存介質(zhì)就容易出問題,SD卡處于不能正常使用的狀態(tài)十分多。先來說說外部存儲相關(guān)的使用方法和API: a.Check media availability檢查介質(zhì)的可用性 如前所述,外部存儲介質(zhì)的穩(wěn)定性十分的差,所 以在使用之前一定要先檢查它的可用性,如果可用再去用
19、view plaincopy to clipboardprint?1.fi nalString state =(state.equals(E nvironmen t.MEDIA_MOUNTED) state.equals(E nviro nmen t.MEDIA_READ_ONL clipboardpri nt?1.fi nalString state(state.equals(E nvironmen t.MEDIA_MOUNTED) state.equals(E nviro nmen t.MEDIA_READ_ONL En viro nmen t.getExternalStorageStat
20、e(); if state.equals(E nviro nmen t.MEDIA_READ_ONLEn viro nmen t.getExternalStorageState();2.ifIIY) / sd card is ready to us view pla in copy to=Environmen t.getExternalStorageState();if| Y) / sd card is ready to us final String state =(state.equals(Environmen t.MEDIA_MOUNTED)|Y) / sd card is ready
21、to us b. Get the directory獲取外部存儲卡的路徑事實上,外部存儲卡的路徑是"/mnt/sdcard",所以你直接這樣寫去訪問也能訪問的到。鑒于可讀性和可移植性的考慮,建議這樣寫:view pla in copy toclipboardpri nt? 1.File sdcardDir = En viro nmen t.getExter nalStorageDirectory(); view pla in copy to clipboardprint? 1.File sdcardDir = Environment.getExternalStorageDi
22、rectory(); File sdcardDir = En viro nmen t.getExter nalStorageDirectory(); c. For API 8 or greater, there are some other useful APIs helping to manager files and directories. 如果你使用 API 8(Android 2.2)或者更高,那么 SDK中又多了幾個操作外部存儲文件和路徑的接口,文檔中也建議開始者更加規(guī)范的使用 SD卡。比如,創(chuàng)建相應的目錄去存儲相應的數(shù)據(jù),Music, Picture,Video等。應用程序目錄也
23、變成了 "/Android/data/package-name/data"。具體的使用可以參考文檔,這里不重復。當 然,就像編程規(guī)范一樣,這里只是規(guī)范,你完全可以不遵守它,但出于可讀性和可移植性, 還是建議按照文檔建議的去做。下面總結(jié)一下使用時應該注意的一些和外部存儲的特點:a.外部存儲卡不是隨時想用就能夠用的,所以一定要記得在使用之前檢查它的可用性b.存儲在外部存儲卡上的數(shù)據(jù)是所有應用程序都可見,用戶也可見(使用FileManager),所以安全性不是很好,雖然文檔聲稱可以在外部存儲卡上寫程序私有數(shù)據(jù),但貌似沒用,用FileManager仍然可以刪除或編輯文件( Mark
24、et上面的FileManager功能都十分的強大,能 讓用戶看到SD卡中的所有文件,和操作能看到的文件)。c. An droid手機支持把外部存儲卡Mount至PC做為U盤,當連接數(shù)據(jù)線時,這時SD卡變成了 U盤連接到了另外的操作系統(tǒng)中。什么意思,就是在An droid當中雖然有的文件屬性(隱藏,私有等),到了 PC上就不一定管用了,用戶在PC上可以隨意操作文件(這就是第二點中所提及的)。d.如果使用外部存儲卡保存數(shù)據(jù),一定要額外做好異常處理:外部存儲卡不可用時把數(shù)據(jù)存入哪里; 可用的時候再怎么同步數(shù)據(jù)(這是比較頭疼的地方,可行的做法就是當SD卡不可用時不準用戶寫數(shù)據(jù),但這用戶體驗又不是很好,
25、但如你所知,很多應用都這么干);你的數(shù)據(jù)被破壞了。當然常見的異常也要考慮,比如空間滿了,無法寫入,磁盤壞道等。1.SQLite Database數(shù)據(jù)庫An droid對數(shù)據(jù)庫的支持很好,它本身集成了SQLite數(shù)據(jù)庫,每個應用都可以方便的使用它,或者更確切的說,An droid完全依賴于SQLite數(shù)據(jù)庫,它所有的系統(tǒng)數(shù)據(jù)和用到 的結(jié)構(gòu)化數(shù)據(jù)都存儲在數(shù)據(jù)庫中。它具有以下優(yōu)點:a.效率出眾,這是無可否認的b.十分適合存儲結(jié)構(gòu)化數(shù)據(jù)c.方便在不同的Activity ,甚至不同的應用之間傳遞數(shù)據(jù) 先前有篇文章講到了不同 Activity和不同應用之間傳遞數(shù)據(jù)的麻煩,特別是對于大型數(shù)據(jù)結(jié)構(gòu),因為Activity雖是Java對象,但去無法像使用其他類對象那樣去創(chuàng)建一個實例然后使用它, 更無法給Activity加上Setters和Getters (雖然這樣做了沒有編譯錯誤)。比較好的解決方案 就是把結(jié)構(gòu)化數(shù)據(jù)寫入數(shù)據(jù)庫,然后在不同的Activity之間傳遞它們的 Uri。 d.由專門的Conte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合股開餐廳合同范本
- 衛(wèi)生清潔合同范本
- 勞務(wù)派遣合同范本2003
- 個人供貨客戶合同范本
- 合股認購合同范本
- 合伙協(xié)議書范本合同范本
- 叉車工聘用合同范本
- 員工合同范例送水
- 傳單兼職人員合同范本
- 劇組財務(wù)合同范本
- 入托入學兒童預防接種證查驗接種證工作課件
- 《犀牛軟件基礎(chǔ)教程》課件
- 【村級財務(wù)管理問題探究國內(nèi)外探究綜述3300字】
- 智慧城市新篇章2024年智慧城市發(fā)展機遇展望
- 工程分包商履約情況與進度關(guān)聯(lián)分析
- 培訓業(yè)務(wù)的競爭對手分析與對策
- 供應商QSA-QPA評鑒表
- 安全生產(chǎn)個臺賬內(nèi)容
- 建設(shè)工程項目-月度安全檢查表
- 硬件設(shè)計的模塊化
- 貴州教育大講堂《科技教育之美“中國天眼”的前世今生》觀后感11篇
評論
0/150
提交評論