[官网文档翻译]Flutter持久化库drift - 高级特性 - DAO

11,671 阅读1分钟

Flutter持久化库drift(原moor)官方文档翻译汇总 - 掘金 (juejin.cn)

本文翻译自 drift 的 官方文档 DAOs (simonbinder.eu)

肉翻多有不足,不吝赐教。


重要通知: moor 已改名为 drift 。更多信息[中文]。

DAO

用 DAO 保持你的数据库代码模块化

如果有很多的查询,把它们都放进一个类里会变得冗长。 可以把一些查询抽取出来放进类中,从数据库类里可以使用它们。 考虑下以下代码:

part 'todos_dao.g.dart';

// _TodosDaoMixin 会被 drift 创建。
// 它包含表需要的所有必要字段。
// <MyDatabase> 类型注释是数据库类,会使用这个 DAO。
@DriftAccessor(tables: [Todos])
class TodosDao extends DatabaseAccessor<MyDatabase> with _$TodosDaoMixin {
  // 构造方法是必需的,这样主数据库可以创建这个对象的实例。
  TodosDao(MyDatabase db) : super(db);

  Stream<List<TodoEntry>> todosInCategory(Category category) {
    if (category == null) {
      return (select(todos)..where((t) => isNull(t.category))).watch();
    } else {
      return (select(todos)..where((t) => t.category.equals(category.id)))
          .watch();
    }
  }
}

如果现在将 MyDatabase 类的注解改为 @DriftDatabase(tables: [Todos, Categories], daos: [TodosDao]), 然后重新运行代码生成,生成的 getter todosDao 会用来访问这个 DAO 的实例。