当前位置: 首页 > 知识库问答 >
问题:

如何使我的共享首选项对象在应用程序关闭后保存数据?

徐正雅
2023-03-14

我做了一个应用程序,她的主要目的是保存某种信息(现在哪个信息不重要),在我的应用程序中,我做了一个名为sp的< code>SharedPreferences对象和一个< code>SharedPreferences。编辑器调用编辑器的对象

在我的on创建()方法中,我检索存储的HashSet,如下所示:

    Set<String> setFull = sp.getStringSet("SET_FULL", new HashSet<String>());

如果它是null,我得到一个新的HashSet(第一次使用),以及我需要存储的所有信息Im作为不同的字符串存储到其中。

我需要这一套能被我所有的活动所接受,所以我使用:

   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:在我的主要活动中覆盖方法onOP()

@Override
protected void onStop() {
    super.onStop();
    editor.putStringSet("SET_FULL", setFull);
    editor.apply();
}

我还尝试在我的主要活动中将所有 4 个选项(也只尝试了 2 或 3 个等)一个接一个地放在一起,但这似乎也不起作用。

我也试着在。将()提交给。apply()(在我的< code>SharedPreferences上。编辑器对象,当我使用< code >时。将StringSet(",set)放在上面)但是两者都给出了相同问题,不多不少。

我没有收到任何错误,也没有警告或问题(没有崩溃没有任何东西),一旦应用程序关闭,无论哪种方式,它似乎都会删除所有内容。在过去的一周里,我一直在寻找解决方案,还问了朋友(他们建议与互联网相同,这是压倒一切的方法),但似乎没有一个有效,但是我读到或我问的任何地方都告诉我,即使在我的应用程序关闭后,SharedPreferences对象也应该保留我存储的数据。

共有2个答案

魏英勋
2023-03-14

这两个解决方案是:第一个是基于@Henry的答案:而不是操作HashSet,我从共享首选对象中获得,复制它(对象本身,而不是引用),就像这样:

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

第二个是在每次我再次将东西放入SharedPre的对象之前,添加以下命令:

 editor.clear();

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

感谢所有帮助过我的人!

华欣怡
2023-03-14

如留档所述:

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

因此,请确保不要更改< code >设置

 类似资料:
  • 我正在创建一个番茄工作计时器应用程序。它有2项活动: 主要活动是设置时间 我已经创建了一个对象,它保存了设置的时间,我希望这些时间显示在Recents活动中的按钮中。但是,似乎没有保存数据,而是显示了包名称。

  • 我正在尝试将Firebase DataSnapshot对象保存到SharedReferences。 请看这篇文章,我在其中设计了一种方法来实现这一点。 ... 到目前为止,我已经尝试了: > 使用Gson。Json方法。结果:似乎不起作用。。。我不认为DataSnapshot类是“POJO”类型的类。。。至少没有一个能与gson合作。 使用此方法: 私有静态字符串toString(可序列化o)引发

  • 你好,我正在尝试保存一个共享首选项的主题。当用户点击某个主题的按钮时,我希望该主题被设置为默认并保存,所以当他们重新打开应用程序时,它仍然是那个新主题。

  • 我正在向SharedPreference添加一个集合。这是来自另一个类的静态集,该类处理一些数据并将其存储在该集中。 然后我转到另一个活动(订单活动),在那里我显示了这组信息。第一次访问共享偏好时,我能够获得正确的详细信息。例如name1、name2、name3。 然后,我离开此活动,返回到另一个活动,添加另一个名称,然后再次返回到此 Order 活动。我希望这次得到名称1,名称2,名称3,名称4

  • 我已经在这里寻找答案,但没有一个适用于我的具体情况。我有一个数组列表 用户可以通过与应用程序交互向其中添加条目。我知道SharedReferences不适用于对象,我无法让gson工作。 我想保存的数组列表在on暂停,并寻找一个预先存在的保存列表在on创建。这是正确的做法吗? 编辑:我应该澄清,每个条目由两个字符串组成。这是obj构造函数: 所以每个条目基本上是这样的:

  • 以下是我的主要活动 这是我的作品 下面是我的activity_main.xml 和主要活动 现在调试器输出 很明显,即使我稍微调整一下,它也不能正常工作。接下来是:使用共享首选项保存android主题