1. 程式人生 > >SharedPreferences的使用二

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檔案