如何在 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 对象的主要内容,如果未能解决你的问题,请参考以下文章
以 JSON 或 SQLITE (Android) 存储数据
Android SQLite, JSON, List 用于存储常量对象