Android SharedPreferences存儲的正確寫法
SharedPreferences 特點(diǎn)
即便是Android小白都知道的SharedPreferences的用法,這是保存數(shù)據(jù)最簡便的方法,但是不處理好的話后期維護(hù)將是一個(gè)巨大的坑。那么該如何處理好SharedPreferences才方便維護(hù)呢。先從它的特點(diǎn)開始入手吧。
- 通過Context.getSharedPreferences()獲取的SharedPreferences是一個(gè)單例
- SharedPreferences.edit()每次都會創(chuàng)建一個(gè)新的編輯對象,commit()之前一切改動都無效
SharedPreferences的具體實(shí)現(xiàn)并不在公開API內(nèi),創(chuàng)建方法只有通過Context獲取。具體實(shí)現(xiàn)我們不去研究,通過Log打印每次獲取的對象都是同一個(gè),同樣的方法可知道每次edit()都會得到不同的對象。
難以維護(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保存和讀取的方法非常簡便,正因此才不易維護(hù),可能因?yàn)閷戝e(cuò)Key而找不出問題所在,當(dāng)然一般我們都會把Key寫成靜態(tài)常量。但隨著項(xiàng)目增大,可能需要多處修改用戶信息,每次都要一個(gè)個(gè)put(), 除了寫著厭煩看著難受,當(dāng)遇到需要增加或減少字段時(shí)也非常不便。
SharedPreferences 該這么寫
如果能保留原有寫法,又能規(guī)范方法那是最好不過了,看下SharedPreferences的接口方法并不多,很容易就寫個(gè)包裝類封裝下。
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(); } } }
接下來的使用就簡單了
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);
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android 8.0 中如何實(shí)現(xiàn)視頻通話的畫中畫模式的示例
本篇文章介紹了Android 8.0 中如何實(shí)現(xiàn)視頻通話的畫中畫模式的示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11android 之Spinner下拉菜單實(shí)現(xiàn)級聯(lián)
android 之Spinner下拉菜單實(shí)現(xiàn)級聯(lián),需要的朋友可以參考一下2013-02-02Android SDK命令行工具M(jìn)onkey參數(shù)及使用解析
這篇文章主要介紹了Android SDK命令行工具M(jìn)onkey參,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值數(shù)及使用解析,需要的朋友可以參考下2020-10-10android okhttp的基礎(chǔ)使用【入門推薦】
本文主要總結(jié)了Android著名網(wǎng)絡(luò)框架-okhttp的基礎(chǔ)使用。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01Android四大組件之廣播BroadcastReceiver詳解
Android開發(fā)的四大組件分別是:活動(activity),用于表現(xiàn)功能;服務(wù)(service),后臺運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫,本篇著重介紹廣播組件2021-11-11Android 照相機(jī)的實(shí)例應(yīng)用
這篇文章主要介紹了Android 照相機(jī)的實(shí)例應(yīng)用的相關(guān)資料,希望通過此文能掌握Android照相機(jī)的使用方法,需要的朋友可以參考下2017-08-08第三方開源Android TickPlusDrawable狀態(tài)可以通過動畫切換的按鈕
Android tickplusdrawable(TickPlusDrawable)是一個(gè)狀態(tài)可以通過動畫切換的按鈕,本文給大家分享第三方開源Android TickPlusDrawable狀態(tài)可以通過動畫切換的按鈕,感興趣的朋友一起學(xué)習(xí)吧2015-12-12