我的Storyteller
班级与SharedPreferences互动。
它从SharedPreferences加载一个StringSet,其默认值包含22个字符串,保存在chapters
变量中。
当程序中稍后发生“完成”事件时,Storyteller
会从chapters
中删除字符串,然后将其提交给SharedPreferences。
我的日志显示首先加载22个字符串,然后在删除并提交给编辑器后显示21个字符串。
当我再次运行程序时,加载了22章而不是预期的21。
private Set<String> chapters;
protected Storyteller(Context c) {
buffer = "";
choices = new JSONArray();
SharedPreferences sharedPref = c.getSharedPreferences(c.getString(R.string.pref_key), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
chapters = sharedPref.getStringSet("chapters", new HashSet<String>());
Log.v("sip", chapters.toString());
Log.v("sip-loaded", String.valueOf(chapters.size()));
if (chapters.isEmpty()) {
Log.v("sip", "saving vignettes");
ArrayList<String> names = vignettes();
for (int i = 0; i < names.size(); i++) {
String name = names.get(i);
chapters.add(name);
}
editor.putStringSet(c.getString(R.string.chapters), chapters);
editor.commit();
}
Log.v("sip", String.valueOf(chapters.size()));
}
public void complete(String chapter, Context c) {
chapters.remove(chapter);
SharedPreferences sharedPref = c.getSharedPreferences(c.getString(R.string.pref_key), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putStringSet(c.getString(R.string.chapters), chapters);
editor.commit();
Log.v("sip", String.valueOf(chapters.size()));
chapters = sharedPref.getStringSet("chapters", new HashSet<String>());
Log.v("sip", String.valueOf(chapters.size()));
}
首次登录日志:
12-10 15:24:27.161 3241-3241/? V/sip-loaded: 22
12-10 15:24:27.161 3241-3241/? V/sip: 22
12-10 15:24:27.161 3241-3241/? V/sip-storyloaded: Story loaded
12-10 15:24:37.409 3241-3241/coffeechoices.quantumproductions.com.choicescoffee V/sip: 21
12-10 15:24:37.409 3241-3241/coffeechoices.quantumproductions.com.choicescoffee V/sip: 21
12-10 15:24:37.409
第二次运行的日志:
12-10 15:25:34.097 3307-3307/coffeechoices.quantumproductions.com.choicescoffee V/sip-loaded: 22
12-10 15:25:34.097 3307-3307/coffeechoices.quantumproductions.com.choicescoffee V/sip: 22
12-10 15:25:34.098 3307-3307/coffeechoices.quantumproductions.com.choicescoffee V/sip-storyloaded: Story loaded
编辑:
getString(R.string.chapters)是chapters
,见字符串文件:
<resources>
<string name="app_name">choices.coffee</string>
<string name="pref_key">choices.coffee</string>
<string name="chapters">chapters</string>
</resources>
我正在尝试使用“chapters”和getString,结果相同。
请注意,在我保存complete
函数后,我能够从文件中读取并显示正确的数量,21。当我重新启动时,它是22,但我创建数据集的日志是新的(只有当集合为空时才会被调用。)
答案 0 :(得分:1)
您使用的是两个不同的密钥:R.string.chapters
和"chapters"
。
我认为它们不等同于相同的String。仅使用一个键值切换。
修改强>:
您不应该根据SharedPreferences.getStringSet()的文档直接更改chapters
:
请注意,您不得修改此调用返回的set实例。如果您这样做,则无法保证存储数据的一致性,也无法根据您的能力修改实例。
答案 1 :(得分:0)
致电.clear()
SharedPreferences sharedPref = c.getSharedPreferences(c.getString(R.string.pref_key), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.clear();
允许它正确保存。