【问题标题】:How to store JSON object in SQLite database如何在 SQLite 数据库中存储 JSON 对象
【发布时间】:2013-05-12 07:14:35
【问题描述】:

如何在 SQLite 数据库中存储 JSON 对象?正确的方法是什么?

一个地方是blob类型列。如果我可以将 JSON 对象转换为字节数组并使用 Fileoutputstream

另一个想法是作为字符串存储在文本列中

import org.json.JSONObject;

JSONObject jsonObject;

public void createJSONObject(Fields fields) {
    jsonObject = new JSONObject();

    try {
        jsonObject.put("storedValue1", fields.storedValue1);
        jsonObject.put("storedValue2", fields.storedValue2);
        jsonObject.put("storedValue3", fields.storedValue3);
        jsonObject.put("storedValue4", fields.storedValue4);
        jsonObject.put("storedValue5", fields.storedValue5);
        jsonObject.put("storedValue6", fields.storedValue6);
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • JSON is a textual representation of data。因此,将其保存在 TEXT 列/类型关联中。将其编码为 BLOB 只会增加工作/痛苦 - 不要那样做!当然,JSONObject(它是不是 JSON)中获取实际的JSON。这可以通过jsonObject.toString() 来完成。
  • 如果 Sqlite 不是强制使用,那么我的建议是编写 File.txt 文件并将整个响应保存在文件中并在需要时读取它

标签: android database json sqlite


【解决方案1】:

将 JSONObject 转换为 String 并保存为 TEXT/VARCHAR。在检索同一列时,将 String 转换为 JSONObject。

例如

写入数据库

String stringToBeInserted = jsonObject.toString();
//and insert this string into DB

从数据库读取

String json = Read_column_value_logic_here
JSONObject jsonObject = new JSONObject(json);

【讨论】:

  • 这样插入是否有任何性能问题?
  • @JohnAndrews 当然。等待您的宝贵回复。但更好的存储图像的方法是使用 blob。阅读stackoverflow.com/questions/9357668/…
  • SQLite 有一个新的 JSON 扩展。请参阅 oisin 的评论。
  • @coleifer Android 仍然不支持此功能。通过阅读oisin的答案和附加链接,JSON 是一种可用于将 Json 数据存储到 Sqlite 的类型,但在 Android 中仍不清楚哪种数据类型将支持“JSON”类型的 SQLite。
  • 如果您费心阅读文档,没有 SQLite json 数据类型。只是函数的集合。
【解决方案2】:

另一种方法是为 SQLite 使用新的 JSON 扩展。我自己只是遇到过这个问题:https://www.sqlite.org/json1.html 这将允许您执行一定级别的查询存储的 JSON。如果您使用 VARCHAR 或 TEXT 存储 JSON 字符串,您将无法查询它。这是一篇很棒的文章,展示了它的用法(在 python 中)http://charlesleifer.com/blog/using-the-sqlite-json1-and-fts5-extensions-with-python/

【讨论】:

  • 这是一种使用 NDK 在 Android 上实现的可能方法:sqlite.org/android/doc/trunk/www/index.wiki
  • 从您链接的第一页开始:“json1 扩展(当前)将 JSON 存储为普通文本。向后兼容性限制意味着 SQLite 只能存储 NULL、整数、浮点数的值、文本和 BLOB。无法添加第六个“JSON”类型。”所以是的,即使您想使用 JSON 扩展功能,您也应该将 JSON 存储在 TEXT 列中。
【解决方案3】:

没有数据类型。您只需将其存储为 VARCHAR 或 TEXT。jsonObject.toString();

【讨论】:

    【解决方案4】:

    https://github.com/requery/sqlite-android 允许您查询 JSON 字段(以及其中的数组,我已经尝试过并且正在使用它)。在此之前,我只是将 JSON 字符串存储到 TEXT 列中。它支持 FTS3、FTS4 和 JSON1

    截至 2019 年 7 月,它仍然时不时地出现版本冲突,因此它不是一个死项目。

    【讨论】:

      【解决方案5】:

      https://github.com/app-z/Json-to-SQLite

      首先从 JSON http://www.jsonschema2pojo.org/ 生成普通的旧 Java 对象

      主要方法

      void createDb(String dbName, String tableName, List dataList, Field[] fields){ ...

      字段名称将动态创建

      【讨论】:

        猜你喜欢
        • 2013-02-07
        • 2010-11-17
        • 2013-04-22
        • 2011-02-25
        • 2017-04-03
        • 2020-09-13
        • 2010-11-18
        • 1970-01-01
        • 2019-07-18
        相关资源
        最近更新 更多