除了数据库表定义之外,我还按照漂移文档中的示例声明了一些视图,并成功地完成了生成过程。之后,我对抽象视图类的用法感到非常困惑,我既不能实例化这些类,也不能将其合并到查询定义中(get或watch)。
abstract class TestingRemoteSignalView extends View {
TestingRemoteSignal get testingRemoteSignal;
Bay get bay;
RemoteSignal get remoteSignal;
Expression<String> get description => bay.name + remoteSignal.signalName;
@override
Query as() {
return select([
testingRemoteSignal.id,
bay.name,
description,
testingRemoteSignal.passed,
testingRemoteSignal.skipped,
testingRemoteSignal.touched,
testingRemoteSignal.memo,
]).from(testingRemoteSignal).join([
innerJoin(bay, testingRemoteSignal.bay.equalsExp(bay.id)),
innerJoin(
remoteSignal, testingRemoteSignal.signal.equalsExp(remoteSignal.id))
]);
}
}这些View类的用途是什么,以及如何利用它们进行查询?也许是这样:
final query = select(TestingRemoteSignalView)..where((t) => t.passed.isEquals(true));
query.watch();发布于 2022-10-19 19:35:43
漂移文档中的这个页面有一个关于视图这里的部分。我发现Youtube上的这视频也很有帮助。
按照问题中的内容创建视图代码后,需要将视图添加到数据库定义中,如下所示(从文档中):
@DriftDatabase(tables: [Todos, Categories], views: [CategoryTodoCount])
class MyDatabase extends _$MyDatabase { 然后,您需要删除和重建您的'.g.dart‘文件。
然后,您应该能够像任何其他表一样访问查询中的视图。下面是我自己代码中的一个示例:
视图定义
abstract class FrequencyView extends View {
Frequency get frequency;
Instrument get instrument;
Range get range;
@override
Query as() => select([
frequency.id,
frequency.type,
frequency.start,
frequency.end,
instrument.iname,
range.rname
]).from(frequency).join([
innerJoin(instrument, instrument.id.equalsExp(frequency.instrumentID))
]).join([innerJoin(range, range.id.equalsExp(frequency.rangeID))]);
}
// FrequencyView declared in DraftDatabase declaration below...
@DriftDatabase(tables: [Frequency, Range, Instrument], views: [FrequencyView])
class MyDatabase extends _$MyDatabase {
// we tell the database where to store the data with this constructor
MyDatabase() : super(_openConnection());
// you should bump this number whenever you change or add a table definition.
// Migrations are covered later in the documentation.
@override
int get schemaVersion => 1;
}顺便说一句,在不同的表(' name ')中有相同名称的字段,这会在重新构建.g.dart文件后导致错误。我不确定您是否可以在视图中别名列名,所以我只给出了它们的所有唯一名称。
视图选择查询
import 'package:drift/drift.dart' as drift;
Future<List<FrequencyViewData>> _getFrequencyPlus(MyDatabase db) async {
List<FrequencyViewData> values = await (db.select(db.frequencyView)
..orderBy([(t) => drift.OrderingTerm(expression: t.start)]))
.get();
return values;
}此查询返回完整的数据集。我假设您可以在其中添加"where“子句,就像单个表上的标准select子句一样,以获得部分返回。
https://stackoverflow.com/questions/71319847
复制相似问题