SharedPreferences的使用二
上一節介紹瞭如何獲取SharedPreferences,已經如何修改Context儲存位置。大家知道SharedPreferences是用來儲存資料的,那麼當然就少不了對資料的增刪改查,這一節我們來具體學習下。
在學習之前我們先來看下原始碼,SharedPreferences是一個介面他的原始碼如下
//獲取所有的儲存的值 Map<String, ?> getAll(); //獲取儲存的String型別的值 String getString(String key, @Nullable String defValue); //獲取儲存的String型別的set集合 Set<String> getStringSet(String key, @Nullable Set<String> defValues); //獲取儲存的int型別的值 int getInt(String key, int defValue); //獲取儲存的long型別的值 long getLong(String key, long defValue); //獲取儲存的float型別的值 float getFloat(String key, float defValue); //獲取儲存的boolean型別的值 boolean getBoolean(String key, boolean defValue); //檢視是否儲存對應key的值 boolean contains(String key); //獲取編輯器 Editor edit(); //註冊SharedPreferences值變化監聽器 void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener); //登出SharedPreferences值變化監聽器 void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
通過檢視原始碼我們發現沒有刪除、修改、新增的方法,那麼他的值是怎麼新增、刪除、修改呢?其中我們發現有一個方法獲取一個Editor物件的方法,這個Editor是什麼呢,有名字可以知道是一個編輯器,那麼這個編輯器是幹什麼用的呢?為了瞭解Editor的作用,我們先檢視下原始碼,Editor是一個介面
//存放,修改String型別的值 Editor putString(String key, @Nullable String value); //存放,修改String型別的set集合 Editor putStringSet(String key, @Nullable Set<String> values); //存放,修改int型別的值 Editor putInt(String key, int value); //存放,修改long型別的值 Editor putLong(String key, long value); //存放,修改float型別的值 Editor putFloat(String key, float value); //存放,修改boolean型別的值 Editor putBoolean(String key, boolean value); //刪除key鍵所對應的值 Editor remove(String key); //清空 Editor clear(); //提交,同步提交到磁碟 boolean commit(); //提交,非同步儲存到磁碟 void apply();
通過檢視原始碼可以知道Editor作用就是對SharedPreferences中的資料進行增、刪、查。為什麼需要一個提交的方法而不是每次新增資料後直接提交了,這是為了方便儲存多條資料的時候避免多次提交,用空間換時間。
下面我們來看看Editor的實現,具體實現是在android.app.SharedPreferencesImpl$EditorImpl,這裡我們只看一個string型別的儲存,首先看看原始碼
private final Object mLock = new Object();//同步鎖 private final Map<String, Object> mModified = Maps.newHashMap();//資料暫存區 //存放資料,將資料放入暫存區 public Editor putString(String key, @Nullable String value) { synchronized (mLock) { mModified.put(key, value); return this; } }
提交資料就是一個數據同步到SharedPreferences中,然後再寫到檔案中的過程,這裡就不介紹了。
下面我們再來看看SharedPreferences的實現,具體實現是在android.app.SharedPreferencesImpl,這裡我們也只看獲取string型別值,首先看看原始碼
public String getString(String key, @Nullable String defValue) {
synchronized (mLock) {
awaitLoadedLocked();//等待載入
String v = (String)mMap.get(key);//從map中獲取資料
return v != null ? v : defValue;
}
}
從方法中我們發現數據的來源也是在map中,為什麼要放一箇中間的map而不是每次從xml檔案中獲取,其實這也是一個空間換取時間的方式,為了更快的響應,所以就把資料放入map中,每次只讀取一次xml檔案