Android SharedPreferencesstring集 – 应用程序重新启动后,一些项目被删除

我保存一个string设置在共享偏好设置,如果我读它没关系。 我开始其他活动,回去再读一遍,没关系。 如果我closures了应用程序,并重新启动,我得到的设置,但只有1个项目,而不是4。它始终发生。 有没有一个已知的问题? 我能做什么错?

在一个类中,在应用程序的oncreate方法中创build了什么我有一个SharedPreferences和一个SharePreferences.Editorvariables。 我在保存和加载方法中使用它们。

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(); } 

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

Solutions Collecting From Web of "Android SharedPreferencesstring集 – 应用程序重新启动后,一些项目被删除"

基于你的问题,你应该只在4个项目被添加到集合后才能调用commit。 在你的代码中,你调用了每个反馈的提交,这将覆盖以前的反馈。

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

Note that you must not modify the set instance returned by this call. The consistency of the stored data is not guaranteed if you do, nor is your ability to modify the instance at all.

这正是你在做什么

SharedPreferences.getStringSetlogging了这个“问题”。

SharedPreferences.getStringSet返回SharedPreferences中存储的HashSet对象的引用。 向这个对象添加元素时,它们实际上被添加到SharedPreferences中。

我认为解决方法是你可以做一个返回的Set的副本,然后把新的Set放入SharedPreferences中。 我testing了它,它工作。

尝试创build您的设置的副本,并且可以将其保存在相同的首选项中:

 private Set<String> _setFromPrefs; public void GetSetFromPrefs() { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); Set<String> someSets = sharedPref.getStringSet("some_sets", new HashSet<String>() ); _setFromPrefs = new HashSet<>(someSets); // THIS LINE CREATE A COPY } public void SaveSetsInPrefs() { SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext()); SharedPreferences.Editor editor = sharedPref.edit(); editor.putStringSet("some_sets", _setFromPrefs); editor.commit(); } 

根据文档,SharedPreferences中的string集应该被看作是不可变的,在尝试修改它时,事物会向南。 解决方法是:获取现有集合,复制副本,更新副本,然后将其保存回共享首选项,如同它是一个新集合。

 Set<String> feedbackSet = getFeedbacksSet(); if(feedbackSet == null){ feedbackSet = new HashSet<String>(); } //make a copy of the set, update the copy and save the copy Set<String> newFeedbackSet = new HashSet<String>(); JSONObject json = createJSONObjectfromFeedback(feedbackItem); newFeedbackSet.add(json.toString()); newFeedbackSet.addAll(feedbackSet); ed.putStringSet(CoreSetup.KEY_FEEDBACK, newFeedbackSet); ed.commit(); 

跑到这个相同的问题。 在实例化之后和提交之前通过清除编辑器来解决它。

 sPrefs = PreferenceManager.getDefaultSharedPreferences(context); sFavList = sPrefs.getStringSet(context.getResources().getString(R.string.pref_fav_key), null); sEditor = sPrefs.edit(); sEditor.clear(); // added clear, now Set data persists as expected if (sFavList == null) sFavList = new HashSet<>(); sFavList.add(title); sEditor.putStringSet(context.getResources().getString(R.string.pref_fav_key), sFavList).apply(); 

我试图创build一个副本,但是这并不适用于我。

在这里find解决scheme。

在sharedprefernces中保存string

  SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this); editor.putString("text", mSaved.getText().toString()); editor.commit(); 

从共享首选项中检索数据

  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); String restoredText = prefs.getString("text", null);