解决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
打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: