Aggiungere una tabella in Drift
In un precedente articolo abbiamo visto come usare Drift, una libreria per Dart e Flutter per la gestione di un database locale.
Oggi vediamo come aggiungere una tabella senza perdere i dati già esistenti.
Do per scontato che abbiate già installato la libreria nel vostro progetto.
Di partenza avevo questo file dentro database/database.dart, ed avevo già creato il file database.g.dart:
import 'package:drift/drift.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'dart:io';
import 'package:drift/native.dart';
part 'database.g.dart';
class Macchine extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get nome => text()();
RealColumn get consumo => real()();
}
class Pedaggi extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get tratta => text()();
RealColumn get costo => real()();
}
@DriftDatabase(tables: [Macchine, Pedaggi])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'app.sqlite'));
return NativeDatabase(file);
});
}
A questo punto voglio aggiungere un'altra tabella.
I passi sono:
- aggiungere il codice per la tabella
- aumentare la versione
- aggiungere la MigrationStrategy
Ecco il codice completo:
import 'package:drift/drift.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
import 'dart:io';
import 'package:drift/native.dart';
part 'database.g.dart';
class Macchine extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get nome => text()();
RealColumn get consumo => real()();
}
class Pedaggi extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get tratta => text()();
RealColumn get costo => real()();
}
class Viaggi extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get macchina => text()();
TextColumn get tratta => text()();
RealColumn get costoBenzina => real()();
RealColumn get costoViaggio => real()();
DateTimeColumn get data => dateTime()();
}
@DriftDatabase(tables: [Macchine, Pedaggi, Viaggi])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 2;
@override
MigrationStrategy get migration => MigrationStrategy(
onUpgrade: (m, from, to) async {
if (from == 1) {
await m.createTable(viaggi);
}
},
onCreate: (m) async {
await m.createAll();
},
beforeOpen: (details) async {
// opzionale: callback eseguita prima dell'apertura
},
);
}
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'app.sqlite'));
return NativeDatabase(file);
});
}
Con onCreate impostiamo di creare tutte le tabelle, e corrisponde alla prima apertura dell'app in sostanza.
Con onUpgrade gli diciamo di creare solo la nuova tabella, e lui capirà da solo che si tratta di un upgrade in virtù dello schemaVersion aumentato.
Ricordatevi di lanciare il comando per il build:
dart run build_runner build
Enjoy!
dart flutter drift sqlite
Commentami!