我正在尝试使用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将必须在每次访问时进行复制。因此,这种设计的原因可能是性能。我想他们应该使此函数返回包装在不可修改的类实例中的结果,但这又需要分配。
紫衣仙女
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();
- 3 回答
- 0 关注
- 538 浏览
添加回答
举报
0/150
提交
取消