Android SharedPreferences String Set - 一些项目在应用重启后被移除

标签 android sharedpreferences

我在共享首选项中保存了一个字符串集,如果我读出它就可以了。我开始其他 Activity ,回去再读一遍,就可以了。如果我关闭应用程序并重新启动它,我会得到集合,但只有 1 个项目而不是 4 个项目。它一直在发生。有已知问题吗?我会做错什么?

在一个类中,在应用程序的 oncreate 方法中创建的内容有一个 SharedPreferences 和一个 SharePreferences.Editor 变量。我在保存和加载方法中使用它们。

public void saveFeedback(FeedbackItem feedbackItem) {
    checkSp();
    Set<String> feedbackSet = getFeedbacksSet();
    if(feedbackSet == null){
        feedbackSet = new HashSet<String>();
    }
    JSONObject json = createJSONObjectfromFeedback(feedbackItem);
    feedbackSet.add(json.toString());
    ed.putStringSet(CoreSetup.KEY_FEEDBACK, feedbackSet);
    ed.commit();
}

public Set<String> getFeedbacksSet(){
    checkSp();
    Set<String> ret = sp.getStringSet(CoreSetup.KEY_FEEDBACK, null);
    return ret;
}

private void checkSp(){
    if(this.sp == null)
        this.sp = applicationContext.getSharedPreferences(applicationContext.getPackageName(), Context.MODE_PRIVATE);
    if(this.ed == null)
        this.ed = this.sp.edit();
}

我只是不明白这是怎么发生的,在应用程序运行时完美地存储所有项目,然后在重新启动后并非所有项目都在集合中。而且我认为,如果所有项目都被移除,那么它可能比一些项目消失更容易接受,而一个项目仍然存在。有解释吗?

最佳答案

根据您的问题,您应该仅在将 4 个项目添加到集合后才调用 commit。 在您的代码中,您为每个反馈调用 commit,这将覆盖以前的反馈。

更新: http://developer.android.com/reference/android/content/SharedPreferences.html#getStringSet(java.lang.String , java.util.Set)

请注意,您不得修改此调用返回的集合实例。如果您这样做,则无法保证存储数据的一致性,您也无法修改实例。

这正是你正在做的事情

关于Android SharedPreferences String Set - 一些项目在应用重启后被移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19949182/

相关文章:

Android - 是否可以将整个 Bundle 保存到 SharedPreferences 中?

android - 使用 SharedPreferences 显示字符串不起作用

flutter - 如何在具有共享首选项的情况下持久保存自定义对象列表?

android无法启动模拟器:Cannot run program

android - addPreferencesFromResource 导致 ClassCastException

android - 如何显示全角 DialogFragment?

android - "gradlew connectedCheck mergeAndroidReports"缺少属性异常 : No such property: REPORTS

android - Android 中共享首选项的奇怪问题

java - ScrollView Y 位置

android - 包含 fragment 的框架布局中的 View 的 findViewById 失败