如何在flutter的sqlite数据库中保存嵌套的复杂JSON数据
Posted
技术标签:
【中文标题】如何在flutter的sqlite数据库中保存嵌套的复杂JSON数据【英文标题】:how to save nested complex JSON data in a sqlite database on flutter 【发布时间】:2019-12-06 06:39:12 【问题描述】:我有嵌套的复杂 JSON 数据。 我为他们做了一个模型,我可以序列化和反序列化。
我看了flutter的文档和sqlite中保存数据的例子 但所有示例都是针对简单 JSON 数据,而不是复杂数据。
我为此创建了两个表(order_table,order_item_table)并将order_id键保存在order_item_table中
但是给我一个嵌套地图的查询有点奇怪。
我该怎么做?
class Order
int id;
int userId;
OrderStatus status;
List<OrderItem> orderItems;
DateTime createdAt;
DateTime updatedAt;
Order(
this.id,
this.userId,
this.status,
this.orderItems,
this.createdAt,
this.updatedAt,
);
factory Order.fromJson(Map<String, dynamic> json) => new Order(
id: json["id"],
userId: json["user_id"],
status: OrderStatusValues.map[json["status"]],
orderItems: new List<OrderItem>.from(
json["order_items"].map((x) => OrderItem.fromJson(x))),
createdAt: DateTime.parse(json["created_at"]),
updatedAt: DateTime.parse(json["updated_at"]),
);
Map<String, dynamic> toJson() =>
"id": id,
"user_id": userId,
"status": OrderStatusValues.reverse[status],
"order_items":
new List<dynamic>.from(orderItems.map((x) => x.toJson())),
"created_at": createdAt.toIso8601String(),
"updated_at": updatedAt.toIso8601String(),
;
class OrderItem
int id;
int orderId;
int productId;
int qty;
Product product;
OrderItemStatus status;
String comment;
DateTime createdAt;
DateTime updatedAt;
OrderItem(
this.id,
this.orderId,
this.productId,
this.qty,
this.product,
this.status,
this.comment,
this.createdAt,
this.updatedAt,
);
factory OrderItem.fromJson(Map<String, dynamic> json) => new OrderItem(
id: json["id"],
orderId: json["order_id"],
productId: json["product_id"],
qty: json["qty"],
product: Product.fromJson(json['product']),
status: orderItemStatusValues.map[json["status"]],
comment: json["comment"] == null ? null : json["comment"],
createdAt: DateTime.parse(json["created_at"]),
updatedAt: DateTime.parse(json["updated_at"]),
);
Map<String, dynamic> toJson() =>
"id": id,
"order_id": orderId,
"product_id": productId,
"qty": qty,
'product': product.toJson(),
"status": orderItemStatusValues.reverse[status],
"comment": comment == null ? null : comment,
"created_at": createdAt.toIso8601String(),
"updated_at": updatedAt.toIso8601String(),
;
我创建了这样的关系表:
Future<Database> getDatabase() async
var databasesPath = await getDatabasesPath();
String path = join(databasesPath, 'stock.db');
String sql = '''
CREATE TABLE $_tableName (
order_id INTEGER PRYMARY KEY,
user_id INTEGER,
order_status TEXT,
created_at TEXT,
updated_at TEXT
)
''';
String sql2 = '''
CREATE TABLE $_order_item_table (
order_item_id INTEGER PRYMARY KEY,
order_id INTEGER,
product_id INTEGER,
qty INTEGER,
order_item_status TEXT,
comment TEXT,
order_item_created_at TEXT,
order_item_updated_at TEXT
)
''';
database = await openDatabase(path, version: 1,
onCreate: (Database db, int version) async
await db.execute(sql);
await db.execute(sql2);
);
return database;
【问题讨论】:
你找到一个好的解决方案了吗? 没有使用 moor 数据库? 【参考方案1】:您已经创建了两个 SQL 表,但在您查询它们之前它们是不相关的(例如使用INNER JOIN
)。您必须“手动”在嵌套 JSON 表示和关系 SQL 查询之间进行转换(反之亦然)。您是否考虑过更符合您的 JSON 结构的替代数据库,例如 Cloud Firestore?
【讨论】:
以上是关于如何在flutter的sqlite数据库中保存嵌套的复杂JSON数据的主要内容,如果未能解决你的问题,请参考以下文章
Flutter应用打开时如何从sqlite数据库加载初始状态数据
解析嵌套的 JSON 并将其保存到 SQLite 中,然后检索它