22

我尝试使用 androids sharedpreferences,我已经记录了所有内容,下面的代码确实提交了字符串集。问题是当我强制关闭应用程序并重新启动时,settings.getStringSet 返回一个空集。任何地方都没有错误消息。

我试过 PreferenceManager.getDefaultSharedPreferences 但这对我也不起作用。

谢谢你的时间。

public static final String PREFS_NAME = "MyPrefsFile";
private static final String FOLLOWED_ROUTES = "followedRoutes";

稍后在保存时调用:

public void onFollowClicked(View view){

SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();

Set<String> follows =  settings.getStringSet(FOLLOWED_ROUTES, new HashSet<String>());
follows.add(routeId);

editor.putStringSet(FOLLOWED_ROUTES, follows);
editor.commit();

}
4

2 回答 2

34

您也可以通过以下方式解决 g00dy 提到的错误:

从 sharedPreferences 获取集合并将其保存在变量中。

然后只需删除 sharedpreferences 中的集合,然后在保存时再次添加它。

SharedPreferences.Editor editor= sharedPref.edit();
editor.remove("mSet");
editor.apply(); 
editor.putStringSet("mSet", mSet);
editor.apply();

确保使用 apply() 或 commit() 两次。

或者,如果您只是在 Kotlin 中工作:

PreferenceManager.getDefaultSharedPreferences(applicationContext)
    .edit {
        this.remove("mSet")
        this.apply()
        this.putStringSet("mSet", mSet)
    }
于 2014-10-11T14:33:36.470 回答
20

看看这里

也供参考:

共享首选项

SharedPreferences.Editor

编辑:

这实际上有一个错误,请参见此处。从那里摘录:

这个问题在 17 API 级别上仍然存在。

这是因为 SharedPreferences 类的 getStringSet() 方法没有返回 Set 对象的副本:它返回整个对象,并且当您向其中添加新元素时,SharedPrefencesImpl.EditorImpl 类的 commitToMemory 方法会看到现有值等于存储的前一个值。

解决此问题的方法是复制 SharedPreferences.getStringSet 返回的 Set 或使用始终更改的其他首选项(例如,每次存储集合大小的属性)强制写入内存

编辑2:

这里可能有解决方案,看看。

于 2013-07-04T12:21:22.387 回答