为了账号安全,请及时绑定邮箱和手机立即绑定

尝试使用SharedPreferences存储字符串集时的行为不当

尝试使用SharedPreferences存储字符串集时的行为不当

波斯汪 2019-12-26 13:58:15
我正在尝试使用SharedPreferencesAPI存储一组字符串。Set<String> s = sharedPrefs.getStringSet("key", new HashSet<String>());s.add(new_element);SharedPreferences.Editor editor = sharedPrefs.edit();editor.putStringSet(s);edit.commit()我第一次执行上面的代码时,s设置为默认值(刚创建的结尾为empty HashSet),并且存储时没有问题。第二次和下一次执行此代码时,将s返回一个对象,并添加第一个元素。我可以添加该元素,并且在程序执行期间,该元素显然存储在中SharedPreferences,但是当程序被杀死时,SharedPreferences将从其持久性存储中再次读取并丢失较新的值。如何存储第二个以及之后的元素,以免丢失?
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

记录了此行为,因此是设计使然:


从getStringSet:


“请注意,您一定不能修改此调用返回的设置实例。如果这样做,不能保证存储数据的一致性,也不能保证完全修改实例。”


而且似乎很合理,特别是如果在API中进行了说明,否则此API将必须在每次访问时进行复制。因此,这种设计的原因可能是性能。我想他们应该使此函数返回包装在不可修改的类实例中的结果,但这又需要分配。


查看完整回答
反对 回复 2019-12-26
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

正在寻找相同问题的解决方案,并通过以下方式解决了该问题:


1)从共享首选项中检索现有集合


2)制作一个副本


3)更新副本


4)保存副本


SharedPreferences.Editor editor = sharedPrefs.edit();

Set<String> oldSet = sharedPrefs.getStringSet("key", new HashSet<String>());


//make a copy, update it and save it

Set<String> newStrSet = new HashSet<String>();    

newStrSet.add(new_element);

newStrSet.addAll(oldSet);


editor.putStringSet("key",newStrSet); edit.commit();


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 513 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信