我刚刚开始使用Moor Database for Flutter。我将连接我的两个表,从两个表中获取一些列。
我已经检查了文档中给出的示例如下:
// we define a data class to contain both a todo entry and the associated category
class EntryWithCategory {
EntryWithCategory(this.entry, this.category);
final TodoEntry entry;
final Category category;
}
// in the database class, we can then load the category for each entry
Stream<List<EntryWithCategory>> entriesWithCategory() {
final query = select(todos).join([
leftOuterJoin(categories, categories.id.equalsExp(todos.category)),
]);
// see next section on how to parse the result
}
我不明白该把这个类放在哪里。如果我要创建一个新类那么它会给我一个错误选择没有找到关键字。还试图导入相关的沼泽,但不工作。
在哪里我可以写连接查询和使这个类?
Moor基本上是说获取结果并手动构建类。该类与数据库没有关系,因此可以将其放在任何位置。这只是建议的做法。
因此,select语句返回一个对象,您可以将其作为SQL响应遍历结果行。使用这些结果构建将返回的类。
看下一个文档示例:
return query.watch().map((rows) {
return rows.map((row) {
return EntryWithCategory(
row.readTable(todos),
row.readTableOrNull(categories),
);
}).toList();
});
因为是一个流,所以先调用watch()
,然后再调用map()
。
第一个map返回查询的结果,正确命名行,每当数据库中的一行更改时,它将再次发出所有行。
第一个映射内部的第二个映射用于将每一行转换为EntryWithCategory
对象。这样,整个函数返回的是每次更改都更新的对象列表。
您可以为几个表创建其他模型。试试这个变体。
import 'package:drift/drift.dart';
part 'car_dao.g.dart';
@DriftAccessor(tables: [Cars, Bikes])
class CarDao extends DatabaseAccessor<AppDatabase> with _$CarDaoMixin {
final AppDatabase db;
CarDao(this.db) : super(db);
Future<List<CarWithBikeModel>> getCarsWithBikes() async {
final carList = await (select(cars).get();
final bikeList = await (select(bikes).get();
return CarWithBikeModel(
cars: carList,
bikes: bikeList);
}
}