解决SharedPreferences存储StringSet失效的问题
//1. 保存set类型数据
public static void saveSet(Context context, String key, Set<String> value) {
SharedPreferences preferences = context.getSharedPreferences(CommonData.SPNAME, Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ? Context.MODE_PRIVATE : Context.MODE_MULTI_PROCESS);
Editor edit = preferences.edit();
edit.putStringSet(key, value);
edit.commit();
}
//获取set数据
public static Set<String> getSet(Context context, String key) {
SharedPreferences preferences = context.getSharedPreferences(CommonData.SPNAME, Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB ? Context.MODE_PRIVATE : Context.MODE_MULTI_PROCESS);
return preferences.getStringSet(key, null);
}
java
上面是sp的存取工具类。
问题描述
本来把一些单一不重复的简单数据用sp存为set,读取都方便
但是发现了一个bug,在getSet(mContext,key)拿到Set直接对Set操作后再接着去saveset(mContext,key,set);
在应用没有退出的时候再去getSet还是能拿到已经修过过的新set,把应用退出再进来后竟然发现 保存的set没生效,新add进去的竟然不在了。找了台root手机去看也确实修改完后没发现数据有变化。
后来看了preerences.getStringSet的源码上的注释介绍才明白,看官方注释
- Note that you must not modify the set instance returned
- by this call. The consistency of the stored data is not guaranteed
- if you do, nor is your ability to modify the instance at all.
也就是说,不能直接修改返回的set实例,无法修改实例
解决方法
重新新建一个set对象,把之前的全部都add回去 这样子才能保存生效
Set<String> set1 = SPUtils.getSet(mContext, key);
Set<String> set = new HashSet<>();
set.addAll(set1);
set.add("first data");
set.add("second data");
//再做保存
saveSet(mContext, key, set);
java