如何让我的 SharedPreferences 对象在应用程序关闭后保存数据?
how to make my SharedPreferences object to save data after app closes?
我制作了一个应用程序,她的主要目的是保存某种信息(现在哪些信息并不重要),在我的应用程序中我制作了一个名为 sp 的 SharedPreferences
对象和一个 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()
在每个 activity 中我需要那个集合,所以我像上面的例子一样检索它。
主要activity(我在 HashSet 上进行所有操作),
当 activity 打开并处于活动状态时,我可以添加到该 HashSet 和我的 SharedPreferences
项目并编辑它和所有内容,当我在我的活动之间移动时,我可以看到它以及我添加的所有内容和所有内容很好,但是一旦我关闭我的应用程序(从我的模拟器/phone/android工作室),当我重新打开它时,所有数据都被删除,我需要重新添加所有内容。
我尝试以 4 种不同的方式将集合存储回我的编辑器:
1:在我的 onCreate()
方法中:
editor.putStringSet("SET_FULL", setFull);
editor.apply(); //also tried .commit()
2: 在我的 main activity:
中覆盖方法 onDestroy()
@Override
protected void onDestroy() {
super.onDestroy();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
3: 在我的 main activity:
中覆盖方法 onPause()
@Override
protected void onPause() {
super.onPause();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
4: 在我的 main activity:
中覆盖方法 onStop()
@Override
protected void onStop() {
super.onStop();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
我也尝试将所有 4 个选项(也只尝试了 2 个或 3 个等等)一个接一个地放在我的主 activity 中,但这似乎也没有用。
我也尝试在 .commit() 和 .apply() 之间交换(在我的 SharedPreferences.Editor
对象上,当我在其上使用 .putStringSet("", set)
时)但两者都出现了同样的问题,不多也不少.
我没有收到任何错误,也没有警告或问题(没有崩溃,什么都没有),无论以何种方式关闭应用程序,它似乎都会删除所有内容。
过去一周我一直在寻找解决方案,也问过朋友(谁建议与互联网相同,这是最重要的方法)但 none 似乎有效,但无论我在哪里阅读或我问每个人都告诉我认为 SharedPreferences 对象应该保留我存储的数据,即使在我的应用程序关闭后也是如此。
如文档中所述:
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.
因此请确保不要更改从 getStringSet()
方法返回的 Set<String>
。如果你这样做会发生奇怪的事情。
感谢@Henry 的回答,我解决了我的问题,并且根据我所做的一些额外研究,我将写下解决我问题的两件事。
这两个解决方案是:
第一个是基于@Henry 的回答:不是在 HashSet 上操作我从 SharedPreferences 对象得到的,而是像这样复制它(对象本身而不是引用):
Set<String> newSet = new HashSet(setFull);
第二个是在每次我再次将内容放入 SharedPreferences 对象之前添加此命令:
editor.clear();
这解决了我的整个问题,它在应用程序关闭后将数据保存在 SharedPreferences 中。
感谢所有帮助过的人!
我制作了一个应用程序,她的主要目的是保存某种信息(现在哪些信息并不重要),在我的应用程序中我制作了一个名为 sp 的 SharedPreferences
对象和一个 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()
在每个 activity 中我需要那个集合,所以我像上面的例子一样检索它。
主要activity(我在 HashSet 上进行所有操作),
当 activity 打开并处于活动状态时,我可以添加到该 HashSet 和我的 SharedPreferences
项目并编辑它和所有内容,当我在我的活动之间移动时,我可以看到它以及我添加的所有内容和所有内容很好,但是一旦我关闭我的应用程序(从我的模拟器/phone/android工作室),当我重新打开它时,所有数据都被删除,我需要重新添加所有内容。
我尝试以 4 种不同的方式将集合存储回我的编辑器:
1:在我的 onCreate()
方法中:
editor.putStringSet("SET_FULL", setFull);
editor.apply(); //also tried .commit()
2: 在我的 main activity:
中覆盖方法onDestroy()
@Override
protected void onDestroy() {
super.onDestroy();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
3: 在我的 main activity:
中覆盖方法onPause()
@Override
protected void onPause() {
super.onPause();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
4: 在我的 main activity:
中覆盖方法onStop()
@Override
protected void onStop() {
super.onStop();
editor.putStringSet("SET_FULL", setFull);
editor.apply();
}
我也尝试将所有 4 个选项(也只尝试了 2 个或 3 个等等)一个接一个地放在我的主 activity 中,但这似乎也没有用。
我也尝试在 .commit() 和 .apply() 之间交换(在我的 SharedPreferences.Editor
对象上,当我在其上使用 .putStringSet("", set)
时)但两者都出现了同样的问题,不多也不少.
我没有收到任何错误,也没有警告或问题(没有崩溃,什么都没有),无论以何种方式关闭应用程序,它似乎都会删除所有内容。 过去一周我一直在寻找解决方案,也问过朋友(谁建议与互联网相同,这是最重要的方法)但 none 似乎有效,但无论我在哪里阅读或我问每个人都告诉我认为 SharedPreferences 对象应该保留我存储的数据,即使在我的应用程序关闭后也是如此。
如文档中所述:
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.
因此请确保不要更改从 getStringSet()
方法返回的 Set<String>
。如果你这样做会发生奇怪的事情。
感谢@Henry 的回答,我解决了我的问题,并且根据我所做的一些额外研究,我将写下解决我问题的两件事。 这两个解决方案是: 第一个是基于@Henry 的回答:不是在 HashSet 上操作我从 SharedPreferences 对象得到的,而是像这样复制它(对象本身而不是引用):
Set<String> newSet = new HashSet(setFull);
第二个是在每次我再次将内容放入 SharedPreferences 对象之前添加此命令:
editor.clear();
这解决了我的整个问题,它在应用程序关闭后将数据保存在 SharedPreferences 中。
感谢所有帮助过的人!