90 lines
2.6 KiB
Dart
90 lines
2.6 KiB
Dart
import 'dart:io';
|
|
import 'package:drift/drift.dart';
|
|
import 'package:drift/native.dart';
|
|
import 'package:path_provider/path_provider.dart';
|
|
import 'package:path/path.dart' as p;
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'tables.dart';
|
|
|
|
part 'database.g.dart';
|
|
|
|
@DriftDatabase(tables: [Rides, PerformanceRuns, TelemetrySamples, RideEvents])
|
|
class AppDatabase extends _$AppDatabase {
|
|
AppDatabase() : super(_openConnection());
|
|
|
|
@override
|
|
int get schemaVersion => 2;
|
|
|
|
@override
|
|
MigrationStrategy get migration {
|
|
return MigrationStrategy(
|
|
onCreate: (Migrator m) async {
|
|
await m.createAll();
|
|
},
|
|
onUpgrade: (Migrator m, int from, int to) async {
|
|
if (from < 2) {
|
|
// Add new columns to Rides
|
|
await m.addColumn(rides, rides.distance);
|
|
await m.addColumn(rides, rides.movingTime);
|
|
await m.addColumn(rides, rides.stoppedTime);
|
|
await m.addColumn(rides, rides.averageSpeed);
|
|
await m.addColumn(rides, rides.topSpeed);
|
|
await m.addColumn(rides, rides.elevationGain);
|
|
await m.addColumn(rides, rides.elevationLoss);
|
|
|
|
// Create new tables
|
|
await m.createTable(telemetrySamples);
|
|
await m.createTable(rideEvents);
|
|
}
|
|
},
|
|
);
|
|
}
|
|
|
|
// Insert a new ride and return its ID
|
|
Future<int> startRide() async {
|
|
return into(rides).insert(RidesCompanion.insert(
|
|
startTime: DateTime.now(),
|
|
));
|
|
}
|
|
|
|
// Complete a ride
|
|
Future<void> endRide(int rideId, RidesCompanion data) async {
|
|
await (update(rides)..where((t) => t.id.equals(rideId))).write(data.copyWith(
|
|
endTime: Value(DateTime.now()),
|
|
));
|
|
}
|
|
|
|
// Get all rides
|
|
Future<List<Ride>> getAllRides() => select(rides).get();
|
|
|
|
// Add a performance run
|
|
Future<int> addPerformanceRun(PerformanceRunsCompanion run) {
|
|
return into(performanceRuns).insert(run);
|
|
}
|
|
|
|
// Get best 0-60 time
|
|
Future<double?> getBest0to60() async {
|
|
final query = select(performanceRuns)
|
|
..where((t) => t.type.equals('0-60'))
|
|
..orderBy([(t) => OrderingTerm(expression: t.timeMs, mode: OrderingMode.asc)])
|
|
..limit(1);
|
|
final result = await query.getSingleOrNull();
|
|
return result?.timeMs;
|
|
}
|
|
}
|
|
|
|
LazyDatabase _openConnection() {
|
|
return LazyDatabase(() async {
|
|
final dbFolder = await getApplicationDocumentsDirectory();
|
|
final file = File(p.join(dbFolder.path, 'db.sqlite'));
|
|
return NativeDatabase(file);
|
|
});
|
|
}
|
|
|
|
final databaseProvider = Provider<AppDatabase>((ref) {
|
|
final db = AppDatabase();
|
|
ref.onDispose(db.close);
|
|
return db;
|
|
});
|