SharedPreferce作为Android提供的一种保存数据的解决方案,用于保存键值对形式的数据。一本用于存放应用设置,用户数据等。
常用的类包括
- SharedPreferces 获取建立存储数据
- SharedPreferces.Editor 对数据编辑的接口
- SharedPreferces.OnSharedPreferenChangeListener 数据变化的监听器
SharedPreferces
主要用于创建SharedPreferences对象,通过SharedPreference获取数据。常用API有:
1 2 3 4 5 6 7
| SharedPreferences preferences = context.getSharedPreferences("shared_name",Context.Mode_PRIVATE);
preferences.getBoolean("key",defaultValue); prrferences.get...("key",defaultValue);
Map<String,?> all = preferences.getAll();
|
Editor
SharedPreferences.Editor是用于修改SharedPreferences对象的接口,且Editor做出的修改默认是待处理的,需要使用commit()或者apply()提交修改。
commit()会更快一点
常用的Api有:
1 2 3 4 5 6 7 8 9 10 11 12 13
| SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean("key",value); editor.put...("key",value);
editor.remove("key");
editor.clear();
booleanresult = editor.commit();
editor.apply();
|
SharedPreferenChangeListener
用于监听SharedPreferences的数据改变,常用API有
1 2 3 4 5 6 7 8 9 10 11
| preferences.registerOnSharedPreferenceChangeListener(mListener);
preferences.unregisterOnSharedPreferenceChangeListener(mListener);
SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferces sharedPreferences,String key){ } };
|
性能
- ShredPreferences是单例对象,第一次打开后,之后获取都无需创建,速度很快。
- 当第一次获取数据后,数据会被加载到一个缓存的Map中,之后的读取都会非常快。
- 当由于是XML<->Map的存储方式,所以,数据越大,操作越慢,get、commit、apply、remove、clear都会受影响,所以尽量把数据按功能拆分成若干份。
- App更新后,Preferences不会被移除,在默写情况下,需要创建迁移数据的方案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class MigrationManager { private final static String KEY_PREDERENCES_VERSION = "key_preferences_version"; private final static int PREFERENCES_VERSION = 2;
public static void migrate(Context context) { SharedPreferences preferences = context.getSharedPreferences("pref",Context.MODE_PRIVATE); checkPreferences(preferences); } private static void checkPreferences(SharedPreferences thePreferences) { final int oldVersion = thePreferences.getInt(KEY_PREFERENCES_VERSION,1); if(oldVersion < PREFERENCES_VERSION) { final SharedPreferences.Editor edit = thePreferences.edit(); edit.clear(); edit.putInt(KEY_PREFERENCES_VERSION, currentVersion); edit.commit(); } } }
|
存放位置
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PREFS_NAME.xml
/data/data/YOUR_PACKAGE_NAME/shared_prefs/YOUR_PACKAGE_NAME_preferences.xml
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| public class PreferencesManager {
private static final String PREF_NAME = "com.example.app.PREF_NAME"; private static final String KEY_VALUE = "com.example.app.KEY_VALUE";
private static PreferencesManager sInstance; private final SharedPreferences mPref;
private PreferencesManager(Context context) { mPref = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); }
public static synchronized void initializeInstance(Context context) { if (sInstance == null) { sInstance = new PreferencesManager(context); } }
public static synchronized PreferencesManager getInstance() { if (sInstance == null) { throw new IllegalStateException(PreferencesManager.class.getSimpleName() + " is not initialized, call initializeInstance(..) method first."); } return sInstance; }
public void setValue(long value) { mPref.edit() .putLong(KEY_VALUE, value) .commit(); }
public long getValue() { return mPref.getLong(KEY_VALUE, 0); }
public void remove(String key) { mPref.edit() .remove(key) .commit(); }
public boolean clear() { return mPref.edit() .clear() .commit(); } }
|