SharedPreferences存储StringSet失效的坑!!

用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回去喽 这样子才能保存生效

    原文作者:L_junpeng
    原文地址: https://blog.csdn.net/L_junpeng/article/details/79228178
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞