1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IsarでMap型は取り扱えないので, IsarLinkを使った話

Last updated at Posted at 2024-03-08

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を確認してみる。
スクリーンショット 2024-03-08 23.43.45.png
スクリーンショット 2024-03-08 23.43.34.png

これでJOHNくんをDANIEL先生の生徒としてLinkさせることができました!

あとがき

次に各教科毎に担当の教師がいる場合の 先生:生徒がn:mの関係のを想定した, IsarLinksを使用した例については別記事で取り扱います。

参考情報

IsarLinks 公式ドキュメント https://isar.dev/ja/links.html

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?