猿问

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

我正在尝试使用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将从其持久性存储中再次读取并丢失较新的值。


如何存储第二个以及之后的元素,以免丢失?


波斯汪
浏览 539回答 3
3回答

繁华开满天机

记录了此行为,因此是设计使然:从getStringSet:“请注意,您一定不能修改此调用返回的设置实例。如果这样做,不能保证存储数据的一致性,也不能保证完全修改实例。”而且似乎很合理,特别是如果在API中进行了说明,否则此API将必须在每次访问时进行复制。因此,这种设计的原因可能是性能。我想他们应该使此函数返回包装在不可修改的类实例中的结果,但这又需要分配。

紫衣仙女

正在寻找相同问题的解决方案,并通过以下方式解决了该问题: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 itSet<String> newStrSet = new HashSet<String>();&nbsp; &nbsp;&nbsp;newStrSet.add(new_element);newStrSet.addAll(oldSet);editor.putStringSet("key",newStrSet); edit.commit();
随时随地看视频慕课网APP

相关分类

Android
我要回答