Open4

Drift (Dart / Flutter パッケージ) に入門してみる。

やまげんやまげん

テーブルの宣言(テーブル名末尾 s は省略される)

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

// クラス名を変更する場合はアノテーションを付ける。
('Category')
class Categories extends Table {
  IntColumn get id => integer().autoIncrement()();
  TextColumn get description => text()();
}
やまげんやまげん

データベースの宣言

import 'dart:io';

import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;

(tables: [Todos, Categories])
class MyDatabase extends _$MyDatabase {
  // コンストラクタでデータ保存先を指定する。
  MyDatabase() : super(_openConnection());

  // テーブル定義を変更した際はこのバージョンを上げる。
  
  int get schemaVersion => 1;
}

LazyDatabase _openConnection() {
  // LazyDatabase() を使えばデータ保存先を非同期で取得することができる。
  return LazyDatabase(() async {
    // db.sqlite と呼ばれるデータベースファイルをアプリのドキュメントフォルダーに置く。
    final dbFolder = await getApplicationDocumentsDirectory();
    final file = File(p.join(dbFolder.path, 'db.sqlite'));
    return NativeDatabase.createInBackground(file);
  });
}
やまげんやまげん

Drift の初期化

Future<void> main() async {
  final database = MyDatabase();

  // insert 構文
  await database
      .into(database.categories)
      .insert(CategoriesCompanion.insert(description: 'my first category'));

  // select 構文
  final allCategories = await database.select(database.categories).get();
  print('Categories in database: $allCategories');
}