存儲數據之SharedPreference

官方文檔

SharePreferences類提供了一個通用框架,以便可以保存和檢索原始數據類型的永久性鍵值對。你可使用SharedPreferences來保存任何原始數據類型:boolean,float,int,long,char和String,這些數據將會永久保存。javascript

要獲取應用的應用的SharedPreferences對象,請使用一下兩個方法:java

  1. getSharedPreferences()
  • 若是您須要多個按名稱(使用第一個參數指定)識別的首選項文件,請使用此方法。
  1. getPreferences()
  • 若是您只須要一個用於 Activity 的首選項文件,請使用此方法。 因爲這將是用於 Activity 的惟一首選項文件,所以無需提供名稱。

寫入值的話請按照如下步驟來:android

  1. 調用 edit() 以獲取 SharedPreferences.Editor。
  2. 使用 putBoolean() 和 putString() 等方法添加值。
  3. 使用 commit() 提交新值

要讀取值,請使用 getBoolean() 和 getString() 等 SharedPreferences 方法。多線程

如下是在計算器中保存靜音按鍵模式首選項的示例: app

public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .

       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }

    @Override
    protected void onStop(){
       super.onStop();

      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);

      // Commit the edits!
      editor.commit();
    }
}複製代碼

SharedPreferences getPreferences (int mode)這個方法實際是對getSharedPreferences(String, int)方法的一個簡單包裝,傳如參數默認爲activity的類名。框架

SharedPreferences的使用方法

SharedPreferences是一個用於訪問和修改用於訪問和修改getSharedPreferences(String,int)返回的首選項數據的接口。 對於任何特定的首選項集合,全部客戶端共享此類的單個實例。 對首選項的修改必須經過SharedPreferences.Editor對象進行,以確保首選項值保持在一致狀態並在提交到存儲時進行控制。 從各類get方法返回的對象必須被應用程序視爲不可變的。異步

注意:此類不支持在多個進程中使用。編輯器

  1. boolean contains (String key)
    返回在SharedPreferences中是否包含傳入key的值。包含返回true,不包含返回false。

例如sp.contains("foo"),將會檢查是否包含key值爲foo的存儲鍵值對是否存在。ide

2.SharedPreferences.Editor edit ()工具

獲取SharedPreferences的編輯工具,獲取方法爲
SharedPreferences.Editor edit=sp.edit()

注意:你必須調用commit()方法才能將你的改變的值真正存入到sp中。

3.Map getAll ()
返回一個map類型的全部的鍵值對。

注意:你不能直接編輯這個map。

4.Set getStringSet (String key,
Set defValues)

這個方法將會返回一個set集合,一樣你也不能直接編輯這個集合。

SharedPreferences.Editor的使用方法

1.void apply ()

將編輯器中的SharedPreferences更改提交給正在編輯的SharedPreferences對象。這將原子地執行所請求的修改,替換當前在SharedPreferences中的任何內容。

當使用兩個editor同時編輯時,最後一個調用的editoer將會覆蓋前邊調用的editor結果。

此方法與commit不一樣,apply是將更改的內容當即提交到內存中的SharePreferences中,而後在異步任務中提交到磁盤存儲,而且不會通知你是否成功或者失敗。

假如此時一個編輯器執行常規的commit方法,而apply仍然未完成,則commit將會阻塞,等到apply徹底完成纔會執行commit。

因爲SharedPreferences實例是進程內的單例,若是你不關心返回值,那麼可使用apply()替換任何commit()實例。

你不須要擔憂Android組件生命週期及其與apply()寫入磁盤的交互。該框架確保來自apply()的在線磁盤寫入在切換狀態以前完成。

不建議直接實現SharedPreferences.Editor接口。然而,若是你之前實現它,而且如今獲得關於缺乏apply()的錯誤,你能夠簡單地調用apply()from commit()。

  1. SharedPreferences.Editor clear ()

在編輯器中標記以從首選項中刪除全部值。 一旦commit 被調用,惟一剩餘的SharedPreferences將是您在此編輯器中定義的東西何。

注意,當提交SharedPreferences項時,不管是在此編輯器上放置方法以前仍是以後調用clear,都會先清除。

3.boolean commit ()

將編輯器中的首選項更改提交回正在編輯的SharedPreferences對象。 這將原子地執行所請求的修改,替換當前在SharedPreferences中的任何內容。

注意,當兩個編輯器同時修改首選項時,最後一個editor會覆蓋前一個editor的commit。

若是你不關心返回值,而且你從應用程序的主線程使用它,請考慮使用apply()。

4.SharedPreferences.Editor remove (String key)

在editor中標記這個key的鍵值對將被刪除,在commit中實際完成。

當提交給SharePreferences的時候,不管你在put以前仍是以後調用,remvove都會先執行。

關於我本身的幾點建議:

  1. 如今網上大部分教程或者utils中,將SharedPreferences寫成一個單利模式,其實我我的不建議這樣作,徹底沒有必要,editor的提交方法(apply和commit)都是原子操做,不會存在靜態條件,同時官方文檔也說明禁止在多線程中使用SharedPreferences。
  2. 有不少將Objec對象類存入SharedPreferences中的教程,我認爲也沒有必要,存入的自己就是鍵值對,要在一個值中存入一個對象有點不和廠裏,也不建議這麼作。
相關文章
相關標籤/搜索