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();
}