【发布时间】:2019-09-11 16:06:34
【问题描述】:
我制作了一个应用程序,她的主要目的是保存某种信息(现在哪些信息并不重要),在我的应用程序中,我正在制作一个名为 sp 的 SharedPreferences 对象和一个名为 editor 的 SharedPreferences.Editor 对象。
在我的 onCreate() 方法中,我正在检索存储的 HashSet,例如:
Set<String> setFull = sp.getStringSet("SET_FULL", new HashSet<String>());
如果它为空,我会得到一个新的 HashSet(第一次使用时),以及我需要存储的所有信息作为不同的字符串存储到其中。
我需要这个集合在我的所有活动中都是可以接受的,所以我使用:
SharedPreferences.Editor editor = sp.edit();
editor.putStringSet("SET_FULL", setFull);
editor.apply(); //also tried .commit()
在每个活动中我都需要该集合,因此我将其作为上述示例进行检索。
关于主要活动(我对 HashSet 进行所有操作的活动),
当活动打开并处于活动状态时,我可以添加到该 HashSet 并添加到我的 SharedPreferences 项目中并编辑它和所有内容,当我在我的活动之间旅行时,我可以看到我添加的所有内容并且一切都很好,但是一旦我当我重新打开它时关闭我的应用程序(从我的模拟器/手机/android工作室),所有数据都被删除,我需要重新添加所有内容。
我尝试通过 4 种不同的方式将集合存储回我的编辑器:
1:在我的onCreate() 方法中:
editor.putStringSet("SET_FULL", setFull);
editor.apply(); //also tried .commit()
2:在我的主要活动中覆盖方法onDestroy():
@Override
protected void onDestroy() {
super.onDestroy();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
3:在我的主要活动中覆盖方法onPause():
@Override
protected void onPause() {
super.onPause();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
4:在我的主要活动中覆盖方法onStop():
@Override
protected void onStop() {
super.onStop();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
我还尝试在我的主要活动中将所有 4 个选项(也只尝试了 2 或 3 等)一个接一个地放在一起,但这似乎也没有用。
我还尝试在 .commit() 和 .apply() 之间进行交换(在我的 SharedPreferences.Editor 对象上使用 .putStringSet("", set) 时),但两者都出现了同样的问题,不多不少。
我没有收到任何错误,也没有警告或问题(没有崩溃,没有任何问题),一旦应用程序关闭,无论哪种方式,它似乎都会删除所有内容。 过去一周我一直在寻找解决方案,还问了朋友(他们建议与互联网相同,这是最重要的方法),但似乎没有一个有效,但我阅读的任何地方或我问的每个人都告诉我 SharedPreferences即使在我的应用关闭后,对象也应该将我存储的数据保留在其中。
【问题讨论】:
-
你如何获得首选项 - 你的 sp 对象?
-
是的,我从我的 sp 引用(我的 SharedPreferences 对象)中检索我的 HashSet,并使用我的 SharedPreferences .Editor 编辑器,稍后将其放回
-
不,我的意思是你用来获取 sp 对象的代码。可以加吗?
-
我添加了一些,但这里是完整的:SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor 编辑器 = sp.edit(); Set
setFull = sp.getStringSet("SET_FULL", new HashSet ());然后我对 setFull Set 进行操作,完成后我将其放回原处,如我在问题中所示,如下所示: editor.putStringSet("SET_FULL", toReturn); editor.apply(); //也试过 .commit(); -
看起来不错。我的猜测是,当您关闭模拟器时,您会从中删除应用程序。尝试从模拟器中关闭应用程序,然后在不使用 AndroidStudio 的情况下从模拟器中再次打开它。还会发生吗?
标签: android sharedpreferences storing-data