【问题标题】:Using room sqlite db for storing key value pairs like sharedpreferences使用 room sqlite db 存储键值对,如 sharedpreferences
【发布时间】:2022-01-15 16:27:13
【问题描述】:

对于某些原因,我想使用 sqlite 作为 sqlite 的替代品 我可以使用房间数据库,创建一个名为首选项的表,其结构如下

|关键 |价值 |

|键1 |值1 |

|键2 |值2 |

这种方法的问题是值列只能是文本,但我想存储文本/数字

|关键 |价值 |输入 |

|键1 |值1 |字符串 |

|键2 |值2 |整数 |

根据类型,我可以手动使用 Integer.parse(stringValue) ..

但这看起来像是我在重新发明一个轮子

还有其他我无法掌握的方法吗?

【问题讨论】:

  • 你能补充更多细节吗?例如,您是否要对值执行任何算术运算(例如 WHERE value > 1)?值是否仅限于int或string,没有其他数据类型?
  • 我不想做任何查询,只有getValue作为key,putValue作为key,就这样
  • 就像共享首选项值可以是字符串、整数、双精度、长整数、布尔值等
  • 添加了一个答案,看看能不能解决你的问题
  • 我不想做任何查询,只有 getValue for key 和 putValue for key sql 表没有 getValue 或 putValue。您将对该表执行的操作是针对该表执行查询(SELECT、INSERT、UPDATE 或 DELETE)。通常在这种情况下,您将在应用程序逻辑中处理值的数据类型,您可以在其中使用 try/catch 块来检查值是否为数字。但这也是有问题的,因为有些数值永远不应被视为数字,例如未格式化的电话号码。

标签: android sqlite android-sqlite sharedpreferences android-room


【解决方案1】:

如果您的数据类型未定义,您可以使用 JSON 来存储数据,而不是自己存储数据类型并确定需要执行的解析功能。

在您的示例中,该值变为 JSON 编码字符串。因此,您可以存储任何数据类型并对其进行解析,只需一步,您不必关心数据类型。

例如,

|Key                       |Value        |
|aStringVariable           |"Hello"      |
|anIntVariable             |1            |
|aBooleanVariable          |true         |

您只需要在从数据库中检索 JSON 数据时使用一个函数来解析 JSON 数据,并在存储数据时使用一个函数将数据编码为 JSON。

你没有提到你使用的是哪种语言,假设Java,你可以使用GJson - https://www.javatpoint.com/how-to-convert-string-to-json-object-in-java

由于您不知道数据的结构,因此在将 JSON 转换为对象时可以使用映射。似乎所有流行的 Java 库都支持这一点。

这是一个链接,提供了有关如何使用 gson 和 jackson(以及其他一些)将 JSON 数据解析和反解析为地图的更多详细信息 - Convert a JSON String to a HashMap

【讨论】:

  • 这是一个不错的技巧,因为 "abc" , 232 ,3232.323 都是有效的 json
  • 所以如果我没记错的话我必须做 Gson.fromJson(dbValue, String.class) .. 对吧?
  • @OmkarT 不是。有一段时间没有做过java,但在网上看似乎第二个参数是您要将数据转换为的类。由于您不知道数据的结构,因此您可以使用集合,例如地图
  • 因为我知道我期望的返回类型,例如 db.getTapCount()
  • 如果您知道每个键的期望返回类型,那么问题出在哪里?有一些方法可以检索列 value 的值,例如 getInt() 或 getString()。
【解决方案2】:

不确定为什么你不能使用 SharedPreferences 但是如果你想存储和检索原始类型,你可以在保存时使用 String 并在检索时解析它。 钥匙 | someValue 存储为字符串。

在读取此值时,如果您知道自己的预期,则可以将其解析为特定类型。

【讨论】:

  • 这与我解释的问题相同,因为我认为这不是一个非常干净的解决方案
  • 也许我错过了这条线,但只是为了使用库 (gson) 存储和检索原始类型,无论如何你需要传递要转换的类型并将数据存储在 json 中太多了工作:)
  • 并且不需要在第三列中存储类型
  • 使用一些辅助函数并没有太多的工作:)
猜你喜欢
  • 2015-02-16
  • 2013-05-12
  • 2018-04-24
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
相关资源
最近更新 更多