Aggiungere una tabella in Drift

Mattepuffo's logo
Aggiungere una tabella in Drift

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!


Condividi

Commentami!