使用 DAO 保持数据库代码模块化
摘要
使用 DAO 让你的数据库代码保持模块化
当你的查询越来越多时,把它们都放在一个类里可能会变得很麻烦。为了避免这种情况,你可以把一些查询提取到单独的类(即 DAO,数据访问对象)中,这些类可以从你的主数据库类中访问。
看看下面的代码:
dart
part 'todos_dao.g.dart';
// _TodosDaoMixin 将由 drift 自动生成。它包含了数据表所需的所有字段。
// <MyDatabase> 类型注解指定了应该使用这个 DAO 的数据库类。
@DriftAccessor(tables: [Todos])
class TodosDao extends DatabaseAccessor<MyDatabase> with _$TodosDaoMixin {
// 这个构造函数是必需的,以便主数据库类可以创建这个对象的实例。
TodosDao(super.db);
Stream<List<TodoEntry>> todosInCategory(Category? category) {
if (category == null) {
return (select(todos)..where((t) => t.category.isNull())).watch();
} else {
return (select(todos)..where((t) => t.category.equals(category.id)))
.watch();
}
}
}现在,如果我们把 MyDatabase 类上的注解改为 @DriftDatabase(tables: [Todos, Categories], daos: [TodosDao]),然后重新运行代码生成器,drift 就会为我们生成一个 todosDao 的 getter 方法,通过它我们就可以访问到 TodosDao 的实例了。