【问题标题】:how to make my SharedPreferences object to save data after app closes?如何让我的 SharedPreferences 对象在应用程序关闭后保存数据?
【发布时间】: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


【解决方案1】:

如文档中所述:

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

所以请确保不要更改您从getStringSet() 方法返回的Set&lt;String&gt;。如果你这样做会发生奇怪的事情。

【讨论】:

  • 好的,你会建议我如何行动?因为我需要动态(用户)向其中添加越来越多的项目并将它们保存到 HashSet 中?
  • 您需要将返回的集合复制到另一个。可以更改新设置,然后将其存储回来。
  • 你的意思是这样的: Set setFull = sp.getStringSet("SET_FULL", new HashSet());然后: Set newSet = setFull;然后操作 newSet 上的所有内容,最后将 newSet 存储到我的 SharedPreferences 中?
  • 没有。这不会复制数据。 newSet 只是对同一对象的新引用。
  • 所以你的意思是这样? Set newSet = new HashSet(setFull);我是集合和哈希集的新手,我不确定它是否可以这样?
【解决方案2】:

感谢@Henry 的回答,我解决了我的问题,并且根据我所做的一些额外研究,我将编写解决我问题的两件事。 这两个解决方案是: 第一个是基于@Henry 的回答:不是操纵我从 SharedPreferences 对象获得的 HashSet,而是像这样复制它(对象本身而不是引用):

Set<String> newSet = new HashSet(setFull);

第二个是在每次我在 SharedPreferences 对象中再次添加此命令之前:

 editor.clear();

这解决了我的整个问题,它在应用程序关闭后将数据保存在 SharedPreferences 中。

感谢所有帮助过的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多