import 'package:moor/moor_web.dart'; part 'database.g.dart'; const int _doneEntriesCount = 20; @DataClassName('Entry') class TodoEntries extends Table { IntColumn get id => integer().autoIncrement()(); TextColumn get content => text()(); BoolColumn get done => boolean().withDefault(const Constant(false))(); } @UseMoor(tables: [ TodoEntries ], queries: { 'hiddenEntryCount': 'SELECT COUNT(*) - $_doneEntriesCount AS entries ' 'FROM todo_entries WHERE done' }) class Database extends _$Database { Database() : super(WebDatabase('app', logStatements: true)); @override final int schemaVersion = 1; @override MigrationStrategy get migration { return MigrationStrategy( onCreate: (m) async => await m.createAllTables(), beforeOpen: (engine, details) async { if (details.wasCreated) { // populate default data await createTodoEntry('A simple todo list using moor web', engine: engine); await createTodoEntry('It even supports prepopulated data!', engine: engine); } }, ); } Stream> incompleteEntries() { return (select(todoEntries)..where((e) => not(e.done))).watch(); } Stream> newestDoneEntries() { return (select(todoEntries) ..where((e) => e.done) ..orderBy( [(e) => OrderingTerm(expression: e.id, mode: OrderingMode.desc)]) ..limit(_doneEntriesCount)) .watch(); } Future createTodoEntry(String desc, {QueryEngine engine}) { final resolved = engine ?? this; return resolved .into(todoEntries) .insert(TodoEntriesCompanion(content: Value(desc))); } Future setCompleted(Entry entry, bool done) { return update(todoEntries).replace(entry.copyWith(done: done)); } }