SharedPreferences使用Set的大坑

一、存储集合数据,重新打开App后数据丢失的问题

(一)问题描述

有个历史记录的存本地的功能,使用Set保存数据,然后获取是对的,但是退出程序后重新进入,发现获取的集合的元素和之前不一样,比如说:保存的是A B C,获取的是 A B C,但退出后重新进入获取的集合是空的,数据怎么丢了呢?

(二)解决办法

原来是SharedPreferences 这个类的原因,从SharedPreferences获取的数据,我们操作这个数据,并不会真的改变SharedPreferences里存储的原始数据,需要创建一个SharedPreferences 里面Set的副本。
原来的写法:

historySet = SPUtils.getInstance().getStringSet(SpExtraKeys.cityHistory);

更改后写法:

historySet =new LinkedHashSet(SPUtils.getInstance().getStringSet(SpExtraKeys.cityHistory));

这样数据就不会丢失了~

二、存储集合数据,存储前有序,读取变无序

(一)问题描述

有个历史记录的存本地的功能,我使用的是LinkedHashSet ,元素严格按照放入顺序排列,运行程序,保存数据,然后获取是对的,顺序也是对的,但是退出程序后重新进入,发现获取的集合顺序是错的。比如说:保存的顺序是 A B C,获取的顺序是 A B C,但退出后重新进入获取的顺序是 B C A,这是为什么?

(二)解决办法

原来SharedPreferences在读取配置xml文件时,碰到节点为“set”,即放入的stringSet对象,默认是生成一个HashSet对象进行保存的,即不管在保存的时候你是使用LinkedHashSet 、TreeSet还是HashSet,当你读取的时候都是获取到HashSet对象,读取出来就变成了无序。

最后我还是使用了List转成String存储到SharedPreferences实现了这个功能,只能感叹SharedPreferences有点坑~

你可能感兴趣的:(SharedPreferences使用Set的大坑)