【Flutter】Driftについて

Flutter

Driftとは

Driftは、FlutterとDart用のリアクティブな永続化ライブラリで、SQLiteの上に構築されています。
SQLiteの機能を最大限に活用しながら、DartおよびFlutterアプリケーションにおいて柔軟で強力なクエリやデータベース操作を実行できます。

drift | Dart package
Drift is a reactive library to store relational data in Dart and Flutter applications.

特徴

  • 柔軟性: SQLとDartの両方でクエリを記述でき、結果をフィルタリング、並べ替え、結合して複数のテーブルでクエリを実行可能。
  • 機能豊富: トランザクション、スキーマ移行、複雑なフィルタと式、バッチ更新、結合をサポート。
  • モジュラー: DAOやSQLファイルのインポートのサポートにより、データベースコードをシンプルに保てる。
  • 安全性: テーブルとクエリに基づいて型安全なコードを生成し、コンパイル時にエラーを発見。
  • 高速: 複雑なクエリを許容しながらも、高速なパフォーマンスを実現。
  • リアクティブ: 任意のSQLクエリを自動更新ストリームに変換可能。
  • クロスプラットフォーム対応: Android、iOS、macOS、Windows、Linux、およびWebで動作。
  • 実績と安定性: 幅広いユニットおよび統合テストにより、実績のある安定したライブラリ。

使い方

依存関係の追加

まず、pubspec.yamlファイルにDriftを追加します。

dependencies:
  drift: ^2.18.0
  sqlite3_flutter_libs: ^0.5.0 # SQLiteのFlutter依存関係
  path_provider: ^2.0.11 # デバイス上のファイルパスを見つけるための依存関係

データベースのセットアップ

データベースを設定するための基本的な手順を以下に示します。

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 'dart:io';

// テーブルの定義
class Users extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get name => text().withLength(min: 1, max: 50)();
  IntColumn get age => integer()();
}

// データベースクラスの定義
@DriftDatabase(tables: [Users])
class MyDatabase extends _$MyDatabase {
  MyDatabase() : super(_openConnection());

  @override
  int get schemaVersion => 1;
}

// データベース接続を開く関数
LazyDatabase _openConnection() {
  return LazyDatabase(() async {
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase(file);
  });
}

クエリの実行

データベースに対してクエリを実行するための基本的な例を示します。

// ユーザーを追加
Future<void> addUser(MyDatabase db, String name, int age) async {
  await db.into(db.users).insert(UsersCompanion(
    name: Value(name),
    age: Value(age),
  ));
}

// ユーザーの取得
Future<List<User>> getUsers(MyDatabase db) async {
  return await db.select(db.users).get();
}

// ユーザーの更新
Future<void> updateUser(MyDatabase db, int id, String name, int age) async {
  await db.update(db.users).replace(User(
    id: id,
    name: name,
    age: age,
  ));
}

// ユーザーの削除
Future<void> deleteUser(MyDatabase db, int id) async {
  await (db.delete(db.users)..where((user) => user.id.equals(id))).go();
}

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました