flutterでSQLiteをつかうならDriftがいいかも【使い方】

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('データベースファイルが見つかりません');
  }
}

https://drift.simonbinder.eu/docs/getting-started/


Flutter開発で知らないと損すること Flutter開発で知らないと損すること

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です