每日一題:數(shù)據(jù)持久化
安卓提供了三種方式用于簡單的數(shù)據(jù)持久化功能:
文件儲存,SharedPreference存儲,數(shù)據(jù)庫儲存。
面試率: ★★☆☆☆
面試提醒
數(shù)據(jù)存儲是Android中數(shù)據(jù)持久化的一個概念,我們需要根據(jù)不同的實際需求來存儲文件,例如:
- sp -> 開個記錄,啟動標(biāo)記
- raw -> 靜態(tài)文件,音視頻
- assets -> 較大的資源文件,音視頻
- cache -> 圖片緩存
- sdcard -> 大文件,音視頻
- databases -> 數(shù)據(jù)庫db文件
- KeyStore -> 私鑰,公鑰文件
上面簡單說明了不通路徑的存儲類型,為了更好理解我們應(yīng)該進(jìn)一步去弄懂不同路徑下的特性.
面試技巧
是否具備數(shù)據(jù)持久化的相關(guān)經(jīng)驗,下面三個問題值得嗎?
- 存儲種類
正確的使用Android特有的存儲方式才能保證項目的效率與安全.因此面試有必要準(zhǔn)備下保證能說出這些種類的使用與區(qū)別. - 存儲安全
有些文件涉及到安全問題如一些公私鑰文件,有些甚至直接寫到代碼中,正確的方式應(yīng)該是存放在assets內(nèi). - 項目應(yīng)用
項目那些地方需要持久化,具體如何做.
面試題
下面是對幾種數(shù)據(jù)存儲抽取的一些問題,難度不大,比較簡單.因此同學(xué)們只要記住就可以了.
文件存儲
內(nèi)部存儲
- 調(diào)用Context的openFileOutput()函數(shù),填入文件名和操作模式,它會返回一個FileOutputStream對象。
- 通過FileOutputStream對象的write()函數(shù)寫入數(shù)據(jù)。
- FileOutputStream對象的close ()函數(shù)關(guān)閉流。
提問:
保存編譯時的靜態(tài)文件?
應(yīng)該把文件保存在項目的 res/raw/ 目錄下,你可以通過 openRawResource()方法去打開它.保存內(nèi)存緩存文件?
文件的存儲目錄( /data/data/包名/cache )是一個應(yīng)用專門來保存臨時緩存文件的內(nèi)存目錄,可以使用getCacheDir()去打開一個文件.
外部存儲
getExternalStorageState方法來獲取路徑
提問:
外面的部分機(jī)型存儲路徑是否不同,如何解決?
SP存儲
Activity用SharedPreferences保存數(shù)據(jù)的大小有木有限制?
sp的數(shù)據(jù)是存儲在xml下的,那么xml有沒限制大小呢,答案是沒有.
簡單的數(shù)據(jù)與配置信息,SharedPreferences 是首選,如果數(shù)據(jù)比較大的情況下可以選擇DB或者file存儲.
SharedPreferences什么數(shù)據(jù)都可以保存嗎?
SharedPreferences適用于存儲一些有鍵值對的數(shù)據(jù)類型,并且只能存儲基本類型,即int,long,boolean,String 和 float。事實上它就相當(dāng)于一個 Map,唯一不同的就是 Map 中的 Value 可以是任何對象,而 SharedPreferences中的 Value 只能是基本數(shù)據(jù)類型。
SharedPreference.Editor的apply和commit方法異同?
這兩個方法的區(qū)別在于:
- apply沒有返回值而commit返回boolean表明修改是否提交成功
- apply是將修改數(shù)據(jù)原子提交到內(nèi)存, 而后異步真正提交到硬件磁盤, 而commit是同步的提交到硬件磁盤,因此,在多個并發(fā)的提交commit的時候,他們會等待正在處理的commit保存到磁盤后在操作,從而降低了效率。而apply只是原子的提交到內(nèi)容,后面有調(diào)用apply的函數(shù)的將會直接覆蓋前面的內(nèi)存數(shù)據(jù),這樣從一定程度上提高了很多效率。
- apply方法不會提示任何失敗的提示。
由于在一個進(jìn)程中,sharedPreference是單實例,一般不會出現(xiàn)并發(fā)沖突,如果對提交的結(jié)果不關(guān)心的話,建議使用apply,當(dāng)然需要確保提交成功且有后續(xù)操作的話,還是需要用commit的。
對比幾種存儲數(shù)據(jù)的方式,做如下總結(jié):
? 簡單的數(shù)據(jù)與配置信息,SharedPreferences 是首選
? 如果數(shù)據(jù)量太大,SharedPreferences 不夠用,可以考慮使用數(shù)據(jù)庫
? 對于結(jié)構(gòu)化的數(shù)據(jù),一定要使用數(shù)據(jù)庫,雖然會顯得比較麻煩,但是后續(xù)的使用中會獲益無窮
? 普通文件就是指文本文件,二進(jìn)制文件,多媒體文件等等
? 盡量不要去創(chuàng)建文件,,利用 API 提供的文件存儲方式去存儲文件(SharedPreferences,數(shù)據(jù)庫)
? 如果一定要創(chuàng)建文件,假設(shè)該文件是私密文件或者重要文件,則一定要保存在內(nèi)部存儲中,反之存放到外部存儲即可
? 使用網(wǎng)絡(luò)存儲時要避免傳輸大數(shù)據(jù)量數(shù)據(jù),應(yīng)注意對網(wǎng)絡(luò)傳輸方式的優(yōu)化(減少請求次數(shù)等)