如何在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 中,然后检索它

遍历嵌套的json对象并将数据保存在android sqlite

如何在 Flutter 中加密 SQLite 数据库?

如何在 Flutter 中从 SQLite 获取数据?

使用嵌套地图检索数据并将其保存到 Firebase - Flutter [关闭]