Flutter Moor数据库:join查询适当的结构



我刚刚开始使用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);
         
    
  }

}

最新更新