Android SharedPreferences 使用方法
APP 開發SharedPreferences 是一種輕量化的資料儲存方式,每個 APP 的 SharedPreferences 資料都是各自獨立無法互相存取,當 APP 解除安裝後,資料也會一併刪除。 適合用來儲存簡單輕量的 Key-Value 資料,例如使用者帳號、暱稱、登入時間...等等,複雜格式則建議使用 JSON 檔案或 SQLite 資料庫儲存。 SharedPreferences 支援 Boolean、Float、Int、Long 及 String 等型別,且無需任何權限就可以存取。
取得 SharedPreferences
SharedPreferences 使用 XML 檔案來儲存 Key-Value 資料,這個檔案會建立在 Internal Storage 的 /data/data/[Package Name]/shared_prefs 目錄中。 使用前,必需先使用 getSharedPreferences() 或 getPreferences() 取得 SharedPreferences 物件,再進行後續的各項操作,這些操作都是執行緒安全 (Thread safety) 的。
// 方法一
SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
// 方法二
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
方法一:getSharedPreferences(String name, int mode)
- name 參數
- 為 XML 的檔案名稱,上述行 2 程式碼執行後,將會建立 FileName.xml 檔案,SharedPreferences 實際上就是存取這個檔案中的資料。
- mode 參數
- 設定 SharedPreferences 的操作模式,總共有四種可選模式,分別為 MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE 及 MODE_MULTI_PROCESS,除 MODE_PRIVATE 模式以外,其餘都在新的 API 版本中放棄使用了,因此這個欄位可以固定填寫 MODE_PRIVATE 即可。
使用此方法,只要 name 參數一樣,就可以在不同的 Activity 共用同一個 SharedPreferences 資料。
方法二:getPreferences(int mode)
- mode 參數
- 與方法一相同,可以固定填寫 MODE_PRIVATE 即可。
使用此方法,會使用當前 Activity 的 Class 名稱作為 XML 的檔案名稱,因此在不同的 Activity 中,使用 getPreferences() 建立的檔名是不一樣的,所以資料也不會共用。 但這只是被檔名隔開而已,還是可以使用 getSharedPreferences() 來取得其他頁面使用 getPreferences() 建立的資料。
資料操作
以下是 SharedPreferences 常用操作程式碼,提供大家參考。
寫入
SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt("KEY1", 1);
editor.putBoolean("KEY2", true);
editor.putFloat("KEY3", 1.0f);
editor.putLong("KEY4", 99999);
editor.putString("KEY5", "字串");
editor.putStringSet("KEY6", new HashSet<>());
editor.apply();
- 行 9:也可以用 commit()。
讀取
SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
int value1 = sharedPref.getInt("KEY1", 0);
boolean value2 = sharedPref.getBoolean("KEY2", false);
float value3 = sharedPref.getFloat("KEY3", 0.0f);
long value4 = sharedPref.getLong("KEY4", 0);
String value5 = sharedPref.getString("KEY5", "");
Set<String> value6 = sharedPref.getStringSet("KEY6", new HashSet<>());
刪除
SharedPreferences sharedPref = getSharedPreferences("FileName", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.remove("KEY1");
editor.apply();
- 行 3:remove() 是刪除特定 Key 的資料,如果要清除全部,可以使用 clear()。
- 行 4:也可以用 commit()。
apply() VS commit()
SharedPreferences 異動資料後,必需呼叫 apply() 或 commit() 資料才會實際寫入檔案。
- apply()
- 此方法是將要修改的資料提交到記憶體,再使用非同步方法寫入硬碟,因此效率較高,但並不保證資料一定寫入成功。此外,apply() 不會回傳值,執行失敗也不會顯示任何訊息。因此在某些特定情況下,資料並沒有正確寫入到硬碟,開發人員也很難發現此問題。
- commit()
- 此方法會同步將資料寫入硬碟,因此在多執行緒使用時,會互相等待 commit() 執行完成,因此效率較差。此外,commit() 會回傳 boolean 值,表示本次修改是否提交成功,對資料是否正確寫入至硬碟有比較高的保障。
0 則留言