遇到巨坑SharedPreferences Set<String> getStringSet(String key, Set<String> defValues);

SharedPreferences   大家平时用的比较多,一般存储String,或者基本元素。所以其他元素的读取也理所当然的认为都差不多。

 

问题就是出在我这次使用的

getStringSet

 

 步骤先记录下:

 

1)保存一个数组数据A,先读取旧数据,如果没有旧数据,就新建一个HashSet,将要添加的数据添加至HashSet中,最后保存,通过getHashSetData()读取并打印出来。

2)保存一个数组数据B,先读取旧数据,如果没有旧数据,就新建一个HashSet,将要添加的数据添加至HashSet中,最后保存,通过getHashSetData()读取并打印出来。

3)保存一个数组数据C,先读取旧数据,如果没有旧数据,就新建一个HashSet,将要添加的数据添加至HashSet中,最后保存,通过getHashSetData()读取并打印出来。

 

   public static void saveForceInstall(Context context, String key, String[] content) {

        Set<String> set = getHashSetData(context, key);
        if (set == null)
            set = new HashSet<String>();

        //解析content!!
        try {

            for (int i = 0; i < content.length; i++) {

                String pname = content[i];
                set.add(pname);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        Log.i("c", "force install ,set>>>" + set);
        saveHashSetData(context, key, set);
    }

 

 

 

 public static void saveHashSetData(Context context, String key, Set<String> data) {
        SharedPreferences.Editor ed = getSharedPreferences(context).edit();
        ed.putStringSet(key, data);
        boolean result = ed.commit();
    }


    public static Set<String> getHashSetData(Context context, String key) {
        return getSharedPreferences(context).getStringSet(key, new HashSet<String>());
//        return new HashSet<String>(getSharedPreferences(context).getStringSet(key, new HashSet<String>()));
    }

 

 

 

 

 

这样的过程看似没有问题,而且每次打印的结果也正确。

 

 

-----------------------------奇迹就要发生了!!-------------------------------------------------------------

 

退出应用(完全退出!)

重进界面后,读取之前保存的值,呵呵呵 !

只有第一次存入的值。也就是只有A数据。

 

这样的悲剧我之前是没有遇到的。后来搜索了一番,发现很多筒子也有遇到。

 

解决方式:

 

  public static Set<String> getHashSetData(Context context, String key) {
       // return getSharedPreferences(context).getStringSet(key, new HashSet<String>());
       return new HashSet<String>(getSharedPreferences(context).getStringSet(key, new HashSet<String>()));
    }


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,内存中sharepreferences的set也会相应变化,当commit时,内存中的set和读取的set相同,不执行存储!

为了保证数据一致性,该set实例不能被修改。。。。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值