SQLiteのORMとしてなかなかわかりやすく使いやすかったので、
使い方を書いておきます。
目次
インストール
dependencies:
drift: ^2.18.0
sqlite3_flutter_libs: ^0.5.0
path_provider: ^2.0.0
path: ^1.9.0
dev_dependencies:
drift_dev: ^2.18.0
build_runner: ^2.4.9
テーブルを定義
lib/database.dart
import 'package:drift/drift.dart';
// コマンドで生成するので最初エラーになるよ
part 'database.g.dart';
class TodoItems extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get title => text().withLength(min: 6, max: 32)();
TextColumn get content => text().named('body')();
// リーレーションはこんな感じ
IntColumn get category =>
integer().nullable().references(TodoCategory, #id)();
// DateTimeに対応してくれてる
DateTimeColumn get createdAt => dateTime().nullable()();
}
class TodoCategory extends Table {
IntColumn get id => integer().autoIncrement()();
TextColumn get description => text()();
}
@DriftDatabase(tables: [TodoItems, TodoCategory])
class AppDatabase extends _$AppDatabase {
AppDatabase() : super(_openConnection());
@override
int get schemaVersion => 1;
}
LazyDatabase _openConnection() {
// the LazyDatabase util lets us find the right location for the file async.
return LazyDatabase(() async {
// put the database file, called db.sqlite here, into the documents folder
// for your app.
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'db.sqlite'));
// Also work around limitations on old Android versions
if (Platform.isAndroid) {
await applyWorkaroundToOpenSqlite3OnOldAndroidVersions();
}
// Make sqlite3 pick a more suitable location for temporary files - the
// one from the system may be inaccessible due to sandboxing.
final cachebase = (await getTemporaryDirectory()).path;
// We can't access /tmp on Android, which sqlite3 would try by default.
// Explicitly tell it about the correct temporary directory.
sqlite3.tempDirectory = cachebase;
return NativeDatabase.createInBackground(file);
});
}
コマンド実行
コマンドを実行するといろいろ生成されて使えるようになります。
どっちか実行
一回実行
dart run build_runner build
監視実行
dart run build_runner watch
INSERT
final database = AppDatabase();
await database.into(database.todoItems).insert(TodoItemsCompanion.insert(
title: 'todo: finish drift setup',
content: 'We can now write queries and define our own tables.',
));
database.into(database.todoItems)
ここがテーブルの選択で、
TodoItemsCompanion
というCompanionをつかってinsertする
SELECT
List<TodoItemData> allItems = await database.select(database.todoItems).get();
データベースの削除
import 'dart:io';
import 'package:path_provider/path_provider.dart';
Future<void> deleteDatabaseFile() async {
final directory = await getApplicationDocumentsDirectory();
final dbFile = File('${directory.path}/db.sqlite');
if (await dbFile.exists()) {
await dbFile.delete(); // データベースファイルを削除
print('データベースを削除しました');
} else {
print('データベースファイルが見つかりません');
}
}
Flutter開発で知らないと損すること