如何在 SQLite 数据库中存储 JSON 对象

Posted

技术标签:

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

?正确的方法是什么?

一个地方是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 文件并将整个响应保存在文件中并在需要时读取它 【参考方案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。阅读***.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 月,它仍然时不时地出现版本冲突,因此它不是一个死项目。

https://www.sqlite.org/json1.html(存储和查询 JSON 文档) https://www.sqlite.org/fts3.html(进行全文搜索)

【讨论】:

【参考方案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) ...

字段名称将动态创建

【讨论】:

以上是关于如何在 SQLite 数据库中存储 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

js对象在sqlite中保存和读取

以 JSON 或 SQLITE (Android) 存储数据

如何在ios中将Json数据存储到Sqlite中

Android SQLite, JSON, List 用于存储常量对象

如何在android中分离JSON对并存储在sqlite数据库中?

如何将大型 JSON 数据从服务器存储到 SQLITE Android?