SharedPreferences該怎樣寫

轉(zhuǎn)載自SharedPreferences該怎樣寫

SharedPreferences 特點(diǎn)

即便是 Android 小白都知道的 SharedPreferences 的用法流纹,這是保存數(shù)據(jù)最簡(jiǎn)便的方法,但是不處理好的話后期維護(hù)將是一個(gè)巨大的坑违诗。那么該如何處理 SharedPreferences 才方便維護(hù)呢。先從它的特點(diǎn)開始入手吧疮蹦。

● 通過(guò) Context.getSharedPreferences() 獲取的 SharedPreferences 是一個(gè)單例 SharedPreferences.edit() 每次都會(huì)創(chuàng)建一個(gè)新的編輯對(duì)象诸迟, commit() 之前一切改動(dòng)都無(wú)效

SharedPreferences 的具體實(shí)現(xiàn)并不在公開 API 內(nèi),創(chuàng)建方法只有通 Context 獲取。具體實(shí)現(xiàn)我們不去研究阵苇,通過(guò) Log 打印每次獲取的對(duì)象都是同一個(gè)壁公,同樣的方法可知道每次 edit() 都會(huì)得到不同的對(duì)象。

難以維護(hù)的 SharedPreferences

  SharedPreference userPreferences = context.getSharedPreferences("UserInfo", Context.MODE_PRIVATE);
  userPreferences.edit()
      .putString("id", "myId")
      .putString("name", "myName")
      .putString("head", "myHead")
      .commit();
  Log.e("id", userPreferences.getString("id",""));
  Log.e("name", userPreferences.getString("name",""));
  Log.e("head", userPreferences.getString("head",""));

如上一段 SharedPreferences 保存和讀取的方法非常簡(jiǎn)便绅项,正因此才不易維護(hù)紊册,可能因?yàn)閷戝e(cuò) Key 而找不出問(wèn)題所在,當(dāng)然一般我們都會(huì)把 Key 寫成靜態(tài)常量快耿。但隨著項(xiàng)目增大囊陡,可能需要多處修改用戶信息,每次都要一個(gè)個(gè)put() , 除了寫著厭煩看著難受掀亥,當(dāng)遇到需要增加或減少字段時(shí)也非常不便撞反。

SharedPreferences 該這么寫

如果能保留原有寫法,又能規(guī)范方法那是最好不過(guò)了搪花,看下SharedPreferences 的接口方法并不多遏片,很容易就寫個(gè)包裝類封裝下。** PreferencesWrapper 是裝飾模式撮竿,這里作用是替代繼承吮便,因?yàn)闆]法直接繼承SharedPreferences 的實(shí)現(xiàn)類**

  import android.content.SharedPreferences;
  import android.support.annotation.Nullable;

  import java.util.Map;
  import java.util.Set;

  /**
   * SharedPreferences 包裝類
   * Created by wittytutu on 17-3-29.
   */

  public class PreferencesWrapper implements SharedPreferences {

    protected SharedPreferences mPreferences;

    public PreferencesWrapper(SharedPreferences preferences) {
         mPreferences = preferences;
    }

    @Override
    public Map getAll() {
        return mPreferences.getAll();
    }

    @Nullable
    @Override
    public String getString(String key, @Nullable String defValue) {
        return mPreferences.getString(key, defValue);
    }

    @Nullable
    @Override
    public Set getStringSet(String key, @Nullable Set defValues) {
        return mPreferences.getStringSet(key, defValues);
    }

    @Override
    public int getInt(String key, int defValue) {
        return mPreferences.getInt(key, defValue);
    }

    @Override
    public long getLong(String key, long defValue) {
        return mPreferences.getLong(key, defValue);
    }

    @Override
    public float getFloat(String key, float defValue) {
        return mPreferences.getFloat(key, defValue);
    }

    @Override
    public boolean getBoolean(String key, boolean defValue) {
        return mPreferences.getBoolean(key, defValue);
    }

    @Override
    public boolean contains(String key) {
        return mPreferences.contains(key);
    }

    @Override
    public EditorWrapper edit() {
        return new EditorWrapper(mPreferences.edit());
    }

    @Override
    public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
        mPreferences.registerOnSharedPreferenceChangeListener(listener);
    }

     @Override
     public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
      mPreferences.unregisterOnSharedPreferenceChangeListener(listener);
     }

     public static class EditorWrapper implements Editor {
        protected Editor mEditor;

        public EditorWrapper(Editor editor) {
            mEditor = editor;
        }

        @Override
        public EditorWrapper putString(String key, @Nullable String value) {
            mEditor.putString(key, value);
            return this;
        }

        @Override
        public EditorWrapper putStringSet(String key, @Nullable Set values) {
            mEditor.putStringSet(key, values);
            return this;
        }

        @Override
        public EditorWrapper putInt(String key, int value) {
            mEditor.putInt(key, value);
            return this;
         }

        @Override
        public EditorWrapper putLong(String key, long value) {
            mEditor.putLong(key, value);
            return this;
        }

        @Override
        public EditorWrapper putFloat(String key, float value) {
            mEditor.putFloat(key, value);
            return this;
        }

        @Override
        public EditorWrapper putBoolean(String key, boolean value) {
            mEditor.putBoolean(key, value);
            return this;
        }

        @Override
        public EditorWrapper remove(String key) {
            mEditor.remove(key);
            return this;
        }

        @Override
        public EditorWrapper clear() {
            mEditor.clear();
            return this;
        }

        @Override
        public boolean commit() {
            return mEditor.commit();
        }

        @Override
        public void apply() {
            mEditor.apply();
        }
    }
}

接下來(lái)的使用就簡(jiǎn)單了

public class UserInfoPreferences extends PreferencesWrapper {
    private static final String NAME = "UserInfo";

    public static final KEY_ID = "id"
    public static final KEY_NAME = "name";
    public static final KEY_HEAD = "head";
    public static final KEY_SEX = "sex";

    private static volatile UserInfoPreferences mPreferences;

    public static UserInfoPreferences getInstance(Context context){
        if(mPreferences == null) {
            synchronized (UserInfoPreferences.class){
                if(mPreferences == null) {
                    SharedPreferences preferences = context.getApplicationCtontext().getShaedPreferences(NAME, Context.MODE_PRIVATE);
                    mPreferences = new UserInfoPreferences(preferences);
                }
            }
        }
        return mPreferences;
    }

    public UserInfoPreferences(SharedPreferences preferences) {
        super(preferences);
    }

    // 獲取用戶信息
    public UserInfo getUserInfo(){
        String id = mPreferences.getString(KEY_ID, "");
        String name = mPreferences.getString(KEY_NAME, "");
        String head = mPreferences.getString(KEY_HEAD, "");
        return new UserInfo(id, name, head);
    }

    @Override
    public Editor edit(){
        return new Editor(mPreferences.edit());
    }

    public static class Editor extends EditorWrapper {

        public Editor(SharedPreferences.Editor editor) {
            super(editor);
        }

        // 保存用戶信息
        public Editor putUserInfo(String id, String name, String head) {

            mEditor.putString(KEY_ID, id)
                    .putString(KEY_AME, name)
                    .putString(KEY_HEAD, head);
            return this;
        }

        // 清空用戶信息
        public Editor clearUserInfo() {

            mEditor.remove(KEY_ID)
                    .remove(KEY_NAME)
                    .remove(KEY_HEAD);
            return this;
        }
    }
}

調(diào)用即方便擴(kuò)展,也保留了原有方法幢踏。

UserInfoPreferences preferences = UserInfoPreferences.getInstance(context);
preferences.edit()
    .clearUserInfo()
    .putUserInfo("myId", "myName", "myHead")
    .putInt(KEY_SEX, 0)
    .commit();
UserInfo userInfo = preferences.getUserInfo();
int sex = preferences.getInt(KEY_SEX, 0);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末髓需,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惑折,更是在濱河造成了極大的恐慌授账,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惨驶,死亡現(xiàn)場(chǎng)離奇詭異白热,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)粗卜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門屋确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人续扔,你說(shuō)我怎么就攤上這事攻臀。” “怎么了纱昧?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵刨啸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我识脆,道長(zhǎng)设联,這世上最難降的妖魔是什么善已? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮离例,結(jié)果婚禮上换团,老公的妹妹穿的比我還像新娘。我一直安慰自己宫蛆,他們只是感情好艘包,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耀盗,像睡著了一般想虎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上袍冷,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天磷醋,我揣著相機(jī)與錄音,去河邊找鬼胡诗。 笑死邓线,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的煌恢。 我是一名探鬼主播骇陈,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瑰抵!你這毒婦竟也來(lái)了你雌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤二汛,失蹤者是張志新(化名)和其女友劉穎婿崭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肴颊,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡氓栈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了婿着。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片授瘦。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖竟宋,靈堂內(nèi)的尸體忽然破棺而出提完,到底是詐尸還是另有隱情,我是刑警寧澤丘侠,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布徒欣,位于F島的核電站,受9級(jí)特大地震影響蜗字,放射性物質(zhì)發(fā)生泄漏帚称。R本人自食惡果不足惜官研,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一秽澳、第九天 我趴在偏房一處隱蔽的房頂上張望闯睹。 院中可真熱鬧,春花似錦担神、人聲如沸楼吃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)孩锡。三九已至,卻和暖如春亥贸,著一層夾襖步出監(jiān)牢的瞬間躬窜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工炕置, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荣挨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓朴摊,卻偏偏與公主長(zhǎng)得像默垄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甚纲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容