【问题标题】:How can I store and retrieve HashMap<String, Boolean> using Shared Preferences如何使用共享首选项存储和检索 HashMap<String, Boolean>
【发布时间】:2023-03-12 08:46:01
【问题描述】:

我正在尝试存储复选框文本,它的状态是共享首选项中的布尔值。我遇到了问题 - 检索值时发现不兼容的类型 Entry&lt;String, Capture&lt;?&gt;&gt; 需要 Entry&lt;String, java.lang.Boolean&gt;(在这一行 Map.Entry&lt;String, Boolean&gt; entry4

这就是我在共享首选项中存储值的方式 -

SharedPreferences checkedFilterPref = getContext().getSharedPreferences(
                        Constants.FILTER_CHECKED_PREF, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = checkedFilterPref.edit();
for (Map.Entry<String, Boolean> entry1 : filterPrefHashMap.entrySet()) {
    editor.putBoolean(entry1.getKey(), entry1.getValue());
}
editor.commit();

这就是我尝试检索 HashMap 值的方式 -

for (Map.Entry<String, Boolean> entry4 : checkedFilterPref.getAll().entrySet()) {
    filterPrefHashMap.put(entry4.getKey(), entry4.getValue());
}

我正在遵循StackOverflow post 中分享的技术。我似乎无法正确处理。任何帮助都将不胜感激。

【问题讨论】:

  • 究竟是什么不起作用?你有例外吗?值没有被加载吗?您的应用程序会停止吗?安卓工作室会崩溃吗?请详细说明。
  • checkedFilterPref.getAll().entrySet() 返回什么类型的数据?我怀疑它是 HashMap&lt;String, Boolean&gt; 考虑到您可以在 SharedPreferences 中存储的不仅仅是布尔值
  • 就个人而言,我会选择 JSON 转换路线
  • @cricket_007 checkedFilterPref.getAll().entrySet() 返回Entry&lt;String, Capture&lt;?&gt;&gt; 这就是问题所在。我希望它返回 HashMap&lt;String, Boolean&gt; 以便我可以继续我的代码。
  • 不管怎样,这就是你想要的答案stackoverflow.com/a/26709199/2308683

标签: android hashmap sharedpreferences


【解决方案1】:

您可以在共享首选项中保存原始数据类型。所以将HashMap保存到Shared Preferences中最简单的方法是将HashMap转换成Json字符串,然后将该字符串保存到Shared Preferences中。

在取回它时,您必须再次将字符串转换为 HashMap。

【讨论】:

    【解决方案2】:

    您可以像这样将每个Entry 转换为string

    abc_true, def_false;
    

    然后将它们保存到SharePreferencestrings

    当您从SharePreference 读取数据时,您必须将strings 转换为Entry

    【讨论】:

      【解决方案3】:

      您可以尝试这样做:

      File file = new File(getDir("data", MODE_PRIVATE), "map");
      ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(file));
      outputStream.writeObject(map);
      outputStream.flush();
      outputStream.close();
      

      Source

      【讨论】:

      • 与您复制的帖子相同的评论...您如何从中阅读
      • 对不起,我的错。在这种情况下,使用 Gson 或任何其他类型的序列化将哈希映射编码为字符串,然后您可以保存它。例如,您可以创建一个包含哈希映射、构造函数、getter 等的类,然后将其序列化为字符串:new Gson().toJson(object) 并检索:new Gson().fromJson(savedObjectAsStringFromSharedPreferences, ClassThatContainsHashMapObj.class);
      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 2019-06-27
      相关资源
      最近更新 更多