用sp存取set真是被坑了一大下子!!!
//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); }
上面是我的sp的存取工具类。
本来把一些单一不重复的简单数据用sp存为set,读取都方便,但是发现了一个诡异的bug,在getSet(mContext,key);拿到set直接对set操作后在接着去saveset(mContext,key,set);
在应用没有退出的时候再去getSet还是能拿到已经修过过的新set,把应用退出再进来后竟然发现 保存的set没生效,新add进去的竟然不在了。找了台root手机去看也确实修改完后没发现数据有变化。
后来看了preerences.getStringSet的源码上的注释介绍才明白,看官方注释
* <p>Note that you <em>must not</em> 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<String> set1 = SPUtils.getSet(mContext, key); Set<String> set = new HashSet<>(); set.addAll(set1); set.add("111"); set.add("222"); SPUtils.saveSet(mContext, key, set);
重新新建一个set对象,把之前的全部都add回去喽 这样子才能保存生效