如何在sqlite中存储json数据并在flutter/dart中读取它?

h7wcgrx3  于 2023-05-11  发布在  SQLite
关注(0)|答案(2)|浏览(269)
[
 {
   "id": 1,
   "name": "some name",
   "hobbies": ["chess", "foot ball"],
   "tv": ["movies", "sports"],
   "category": 1,
   "status": 0
   "other": ["...", "...", "...", "..."]
 },
 .. data is repeated here
]

我想把它存储在一个如果我必须把它存储在一个新的表中,我需要很多表,我必须联接它们。
为了简单起见,我只想将其作为文本存储在列中。
我尝试先缩小json并将其存储在sqlite表的列中。
然后我尝试将json字符串化,缩小并存储在sqlite表的列中。

String receivedJson = jsonString; //from that table.
var myData1 = json.decode(receivedJson);
print(myData1);

在这两方面,它都不起作用。
如何将整个JSON数组保存在一个列中并检索它?

wgeznvg7

wgeznvg71#

SQLite不是NoSQL database,而NoSQL database是JSON所需要的。
你想要实现的是可能的,我在一些项目中使用sembast取得了巨大的成功。

  • 另一种用于单进程IO应用程序的NoSQL持久存储数据库解决方案。整个基于文档的数据库驻留在单个文件中,并且在打开时加载到内存中。更改会立即附加到文件中,文件会在需要时自动压缩。*

您可以使用以下命令安装它:

dependencies:
  sembast: ^2.4.10+3

然后你可以从这个工作示例开始:

// basically same as the io runner but with extra output
import 'dart:async';

import 'package:path/path.dart';
import 'package:sembast/sembast.dart';
import 'package:sembast/sembast_io.dart';

Future main() async {
  final db = await databaseFactoryIo
      .openDatabase(join('.dart_tool', 'sembast', 'example', 'record_demo.db'));
  var store = intMapStoreFactory.store('my_user');

  var key = await store.add(db, {
   "id": 1,
   "name": "some name",
   "hobbies": ["chess", "foot ball"],
   "tv": ["movies", "sports"],
   "category": 1,
   "status": 0
   "other": ["...", "...", "...", "..."]
 },);
  var record = await store.record(key).getSnapshot(db);
  record =
      (await store.find(db, finder: Finder(filter: Filter.byKey(record.key))))
          .first;
  print(record);
  var records = (await store.find(db,
      finder: Finder(filter: Filter.matches('name', '^John'))));
  print(records);
}
xxe27gdn

xxe27gdn2#

我想补充一下。
SembastHive等NoSQL数据库将在应用程序启动时将所有数据加载到内存中。
如果您有数千行,这可能会或可能不会在应用程序中使用高内存的问题。
将json对象作为字符串存储在TEXT列中,并有额外的列用于排序,查询等,如idstartDateInt等,这绝对没有错。

根据您的问题定义表示例:

db.execute(
    'CREATE TABLE users(id INTEGER PRIMARY KEY, json TEXT)',
);

插入示例:

await db.rawInsert(
  '''
    INSERT INTO users (json) VALUES (?)
  ''',
  [jsonEncode(obj)],
);

检索示例:

List<Map<String, dynamic>> list = await db.rawQuery(
  'SELECT * FROM users WHERE id = ?',
  [id],
);

YourObjectType? rtnObj;
if (list.isNotEmpty) {
  var jsonMap = json.decode(list[0]['json']) as Map<String, dynamic>;
  rtnObj = YourObjectType.fromJson(jsonMap);
}
  • 显然,你需要把正确的对象类型,无论你有什么。
  • 你还需要做你自己的fromJson方法。

相关问题