01 NOTEゼロワンノートは、転職・独立したい人のサービス開発・転職・副業・起業を応援するサイトです。

FlutterでDriftを使ってデータベースを実装する手順を紹介!

Flutterアプリ開発

Flutterアプリ開発する上でアプリ上のデータを保存して、繰り返し使いたいという場面は多くあるかと思います。今回は、DriftというFlutterパッケージを使ってローカル環境にデータ保存を行う方法を紹介していきます。

Flutterが初めてで導入から知りたいという方は、以下のURLで紹介しているので参考にしてプロジェクトを作成してください。

Driftとは?

アプリのローカル環境でデータベースを構築することにより、データ保存や永続化をできるようにするFlutterパッケージです。このパッケージは、ORMと呼ばれるものでデータベースの扱いを比較的簡単に行えるようにしてくれます。また、APIやDBサーバーなどのオンライン接続をしなくともオフラインでデータ管理できるようになります。

  • SQLとDartの両方でクエリを記述できるため、結果のフィルタリングや並べ替えなど複雑なクエリも書くことができる​
  • マイグレーションやトランザクション、バッチ処理など多くの機能をサポートしている
  • SQLファイルのDAOやインポートをサポートしているため、シンプルに保つことができる
  • タイプセーフなコードを生成し、クエリに誤りがあった場合はコンパイル時に検出できる​
  • スレッドサポートを持つためパフォーマンスに優れている
  • モバイルやデスクトップ、Webなど幅広いプラットフォームで動作する ​

パッケージの導入方法

Driftパッケージを導入するためには、ターミナル上で以下のコマンドを実行します。以下のパッケージでは、SQLiteをデータベースとして使用します。

flutter pub add drift drift_flutter
flutter pub add -d drift_dev build_runner

データベースの作り方、基本設定

ここからは、Driftを使ってデータベースを作成しデータの追加や削除をする方法を紹介していきます。下記の例では、my_databaseという名前のデータベースを作成して、TodoItemsというテーブルを追加しています。schemaVersionの定義は必須になっており、この値を使ってデータベース構造の更新を管理していきます。データベースファイルは、デフォルトではgetApplicationDocumentsDirectoryで取得した場所に保存・取得するようになっています。

テーブルカラムの定義は IntColumn get id => integer().autoIncrement()(); のような形で型や名前を定義できるようになっています。今回は、id, title, content, createdAtを定義します。

import 'package:drift/drift.dart';
import 'package:drift_flutter/drift_flutter.dart';
import 'package:path_provider/path_provider.dart';

part 'database.g.dart';

// TodoItemsテーブルの定義
class TodoItems extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get title => text().withLength(min: 6, max: 32)();
  TextColumn get content => text().named('body')();
  DateTimeColumn get createdAt => dateTime().nullable()();
}

// データベース:my_databaseを作成し、TodoItemsテーブルをデータベースに追加
@DriftDatabase(tables: [TodoItems])
class AppDatabase extends _$AppDatabase {
  AppDatabase([QueryExecutor? executor]) : super(executor ?? _openConnection());

  @override
  int get schemaVersion => 1;

  static QueryExecutor _openConnection() {
    return driftDatabase(
      name: 'my_database',
      native: const DriftNativeOptions(
        databaseDirectory: getApplicationSupportDirectory,
      ),
    );
  }
}

上記のプログラムが追加できたら、下記のコマンドを実行することでdatabase.g.dartファイルを生成します。database.g.dartを生成することで、データベースへアクセスを容易にするためのプログラムが生成されます。

また、上記の設定により、アプリを起動した際に次のようなSQLコマンドが実行され、データベースに先ほど定義したテーブルが作成されます。上手く作成されれば、ローカル上でDBを扱うことができるようになります。

CREATE TABLE todo_items (
  id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  title TEXT,
  content TEXT,
  created_at INTEGER 
);

新しくデータを書き込みする

テーブルにデータを追加するためには、テーブル名のプレフィックスのついたCompanionクラスを使用します。このクラスは、自動生成によりdatabase.g.dartに定義されています。今回の場合は、TodoItemsCompanionクラスが生成されているので、それを使用します。

final database = AppDatabase();

Future<void> addTodoItem(String title, String content) async {
  var insertCompanion = TodoItemsCompanion(title: Value(title), content: Value(content));
  await database.todoItems.insertOne(insertCompanion);
}

保存したデータを更新する

テーブルにデータを追加するためには、テーブル名のプレフィックスのついたCompanionクラスを使用します。このクラスは、自動生成によりdatabase.g.dartに定義されています。今回の場合は、TodoItemsCompanionクラスが生成されているので、それを使用します。

Future<void> updateTodoItem(int id, String title, String content) async {
    var udpateCompanion = TodoItemsCompanion(title: Value(title), content: Value(content));
    await (database.todoItems.update()..where((t) => t.id.equals(id))).write(udpateCompanion);
}

保存したデータを削除する

テーブルからデータを削除するためには、delete関数と対象となる条件をwhere関数を使用して削除します。idを指定して特定のレコードを削除するための関数を例に挙げます。

Future<void> removeTodoItem(int id) async {
  await (database.todoItems.delete()..where((u) => u.id.equals(id))).go();
}

まとめ

今回は、Flutterアプリでローカルデータベースを使用するためのDriftパッケージ活用について紹介しました。Driftを導入し、テーブルの定義やデータの追加、更新、削除などの基本操作を理解することで、アプリ内でのデータ管理が容易にできるようになります。これらの手順を実践して、オフライン環境でも安定したデータベース機能を提供できるようになりましょう。

Copylight 01 NOTE