每日一題:數(shù)據(jù)持久化

每日一題:數(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)部存儲

  1. 調(diào)用Context的openFileOutput()函數(shù),填入文件名和操作模式,它會返回一個FileOutputStream對象。
  2. 通過FileOutputStream對象的write()函數(shù)寫入數(shù)據(jù)。
  3. 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ū)別在于:

  1. apply沒有返回值而commit返回boolean表明修改是否提交成功
  2. apply是將修改數(shù)據(jù)原子提交到內(nèi)存, 而后異步真正提交到硬件磁盤, 而commit是同步的提交到硬件磁盤,因此,在多個并發(fā)的提交commit的時候,他們會等待正在處理的commit保存到磁盤后在操作,從而降低了效率。而apply只是原子的提交到內(nèi)容,后面有調(diào)用apply的函數(shù)的將會直接覆蓋前面的內(nèi)存數(shù)據(jù),這樣從一定程度上提高了很多效率。
  3. 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ù)等)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容