SharedPreferences保存,不会在下次启动时保留

时间:2017-12-10 20:28:14

标签: android sharedpreferences android-sharedpreferences

我的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,但我创建数据集的日志是新的(只有当集合为空时才会被调用。)

2 个答案:

答案 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();

允许它正确保存。