drift/moor/example_web/lib/database/database.dart

67 lines
1.8 KiB
Dart

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<List<Entry>> incompleteEntries() {
return (select(todoEntries)..where((e) => not(e.done))).watch();
}
Stream<List<Entry>> 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));
}
}