Isarとは
Isar公式ドキュメント曰く,最もcoolなFlutterデータベースとのこと。
Flutter のために最適化された高速で軽量なオープンソースのデータベースエンジンであり, 他のモバイルデータベースエンジンと比べてはるかに高速で, あらゆるオブジェクトのデータを保存できます。
執筆時現在, Isarが対応している型は以下です。
- bool
- byte
- short
- int
- float
- double
- DateTime
- String
- List
- List
- List
- List
- List
- List
- List
- List
残念ながらMap型には対応しておらず, 複雑なオブジェクトを取り扱う必要がある時に少し困ります。
IsarLinkとは
リンクは、例えばコメントの作成者(User)のようなオブジェクト間の関係を表現することができ、 1:1、1:n、n:nの関係を IsarLinkで表現することができます。
下記に公式ドキュメントを参考に, 最もシンプルな例として先生:生徒が1:nの場合を想定し, 生徒と担任教師の関係に関するER図を示します。
モデル実装例
import 'package:isar/isar.dart';
part 'school.g.dart';
@collection
class Teacher {
Teacher({
required this.name,
required this.subject,
this.homeroomTeacher = false,
});
Id id = Isar.autoIncrement;
final String name;
final String subject;
final bool homeroomTeacher;
}
@collection
class Student {
Student({required this.name});
Id id = Isar.autoIncrement;
final String name;
final teacher = IsarLink<Teacher>();
}
final teacher = IsarLink<Teacher>();
の部分でStudentに関連付けられた教師は1人と定義しています。
実際に使ってみる
JOHNくんとDANIEL先生を関連付けるAssosiasiateStudentWithTeacher()
を定義します。
Future<void> AssociateStudentWithTeacher() async {
final mathTeacher =
Teacher(name: 'DANIEL', subject: 'math', homeroomTeacher: true);
final studentA = Student(name: 'JOHN');
studentA.teacher.value = mathTeacher;
await isar.writeTxn(() async {
// IsarDBへ教師の登録
await isar.teachers.put(mathTeacher);
// IsarDBへ生徒の登録
await isar.students.put(studentA);
// 生徒の先生を紐付け
await studentA.teacher.save();
});
return;
}
Isar Inspectorでの見え方
アプリをビルドして, AssosiasiateStudentWithTeacher()
を呼び出し後Isar InspectprでDBを確認してみる。
これでJOHNくんをDANIEL先生の生徒としてLinkさせることができました!
あとがき
次に各教科毎に担当の教師がいる場合の 先生:生徒がn:mの関係のを想定した, IsarLinksを使用した例については別記事で取り扱います。
参考情報
IsarLinks 公式ドキュメント https://isar.dev/ja/links.html