当前位置: 首页 > 知识库问答 >
问题:

Flutter Sqflite多表模型

荆亦
2023-03-14

我已经阅读了许多关于如何在Flutter中实现Sqflite的教程和示例。每一个其他示例都只使用一个模型或数据库表。如这些教程中所定义的:

https://pub.dartlang.org/packages/sqflite

https://www.developerlibs.com/2018/07/flutter-sqlite-database-example.html

Future<Todo> insert(Todo todo) async {
    todo.id = await db.insert(tableTodo, todo.toMap());
    return todo;
}

共有1个答案

厍建义
2023-03-14

我做了一些相反的评论,但我刚刚记得在我的上一个项目中,我做了类似的事情,它是针对Firebase数据库的,但对于SQFlite非常类似。

我创建了一个baseItem抽象类,带有一个,所有模型都将从这个类下降。

我还创建了一个baseProvider抽象类,它需要一个BaseItem,并定义访问模型的简单方法。

abstract class BaseItem {
  const BaseItem({this.key});
  final String key;
}

abstract class BaseProvider<T extends BaseItem> {
  Future<List<T>> find();

  Future<BaseKey> upsert(T item);

  Future<int> delete(T item);
}


abstract class FirebaseBaseProvider<T extends BaseItem> {
  // Abstract methods which need to be implemented
  T fromMap(BaseKey key, dynamic map);
  Map<String, dynamic> toJson(BaseKey key, T item);

  Future<DatabaseReference> getReference(BaseKey base) async { ... }    
  BaseKey compileKey(T item, {String useKey}) { ... }

  Future<List<T>> find() async {
    List<T> result = new List();
    // my implementation doesnt work like this, 
    // as it's firebase based, but this would
    // be the place in a Sqflite implementation to use
    // fromMap and load the items
    return result;
  }

  Future<BaseKey> upsert(T item) async {
    if (item == null) return null;

    BaseKey key = compileKey(item);
    (await getReference(key)).set(toJson(key, item));
    return key;
  }

  Future<int> delete(T item) async {
    if (item == null) return null;

    if (item.key != null && item.key != "") {
      (await getReference(compileKey(item))).remove();
    }
    return 0;
  }
}
class News extends BaseItem {
  News({String key, this.creation, this.messageSubject, this.messageBody}) : super(key: key);

  final DateTime creation;
  final String messageSubject;
  final String messageBody;

  bool operator ==(o) => o is News && (o.key == key);
  int get hashCode => key.hashCode;
}

它需要特定的提供者,该提供者只实现TojsonFrommap方法,如下所示:

class NewsProvider extends FirebaseBaseProvider<News> {
  @override
  Map<String, dynamic> toJson(BaseKey key, News news) {
    return {
      "creation": news.creation,
      "messageSubject": news.messageSubject,
      "messageBody": news.messageBody,
    };
  }

  @override
  News fromMap(BaseKey key, dynamic map) {
    DateTime creation = map["creation"] == null ? null : DateTime.tryParse(map["creation"] as String);

    return new News(
      key: key.child.key,
      creation: creation,
      messageSubject: map["messageSubject"] as String,
      messageBody: map["messageBody"] as String,
    );
  }
}

最后,newprovider提供了findupsertdelete方法,但是它们的实现是在抽象类上,所有模型都只有一个实现。

当然,我的实现比这要复杂得多,这既是因为Firebase需要不同的方法来获取/加载项,也是因为find方法最终在每个模型特定的提供程序中都必须不同。但是,相当多的事情是可以简化的。

 类似资料:
  • 问题内容: 我在MySQL数据库中有几个临时表,它们共享相同的架构并具有动态名称。我将如何使用Django与这些表进行交互?一个模型可以从多个表中提取数据吗? 问题答案: 我相信,你可以创建一个工厂函数,该函数将通过动态db_table返回你的模型。 编辑:每次调用此函数时,Django不会创建类属性的新实例。为它创建一个新实例取决于类的名称(Django必须将其缓存在某个地方)。元类可用于在运行

  • 当需要处理复杂数据,很可能你需要使用多个不同的模型来收集用户提交的数据。 举例来说,假设用户登录信息保存在 user 表,但是用户基本信息保存在 profile 表, 你可能需要同时使用 User 模型和 Profile 模型来获取用户登录信息和基本信息。 使用 Yii 提供的模型和表单支持,解决这样的问题和处理单一模型并不会有太大的区别。 下面,我们将为你展示怎样创建一个表单并同时处理 User

  • 英文原文:http://emberjs.com/guides/controllers/representing-multiple-models-with-arraycontroller/ Ember.ArrayController用于代表一组模型。通过在路由的setupController方法中设置ArrayController的model属性,来指定其代表的模型。 可以将ArrayControl

  • 请针对以下需求对Cassandra表的数据模型给出一些建议/想法。我不确定这是否可以实现。如果可以实现,我们就不需要编写外部程序了 注意:这有助于连接两个Kafka主题和任何更新发生在任何一个Kafka,两者将反映在非ormalized格式在卡桑德拉表 根据我们的要求,任何一个主键的值是相同的,应该向上。未插入。

  • 刚开始,我正在为一个应用程序创建一个数据库。由于模式在视觉上变得非常复杂,在多个模式中具有相同的user_table是可能的/可行的/推荐的吗? 例如,blogging模式将具有user_table和与此activity相关的其余表。购物模式将再次具有相同的user_table和表来管理购物activity。等等... 目标是将不同模式中的大量表分离开来,从而简化整体管理。 在另一篇文章中,有人建

  • 我正在努力避免使用多个JTable重复数据。基本上我有一个TableModel,它有一个数据的arraylist和一个字符串[]头。 到目前为止没有什么新东西。现在我有了另一个TableModel,它具有相同的数据数组列表,但具有不同的字符串[]标头。 我无法使我的代码正常工作。我很想知道如何跨多表模型共享数据的arrayList。 因此,当我更改数据时,所有模型都会更新,不会出现数据重复。我想避