【基本】ローカルDB!Isar Database

アプリの設計において、特定のデータを永久的に保存する必要がでてくる場合があります。
その際にローカルDBと言われる、ユーザーのスマホ内に設計するDBを利用します。

ローカルDBは様々なパッケージが存在しますが、
今回は、その中でもよく利用されているパッケージ”Isar Database“をご紹介します。

Isar Databaseとは?

Isar DatabaseはFlutter向けの高速なクロスプラットフォームデータベースです。
アプリのデータをローカルに永続的に保存する際に利用します。

他にもローカルDBはありますが、Isar Databaseは以下の理由で人気があります。

  • 高速性と効率
  • 初心者にも使い易い
  • NoSQLデータベースであるため拡張性が高い
    (今後のアプリの成長に合わせて拡張できる)


どのような時に必要か?

通常のアプリで使用する変数や状態(State)はアプリが終了した際に、
データも一緒に消えてしまいます。

ただアプリを設計する際に、ユーザー操作で発生した状態や変数を
次回起動時に引き継いで、処理を行いたい場面が出てきます。

その際に、Isar Databaseにデータを退避することで、
永続的に保存されるデータを管理することができます。

Isar Databaseの使い方

Isar Databaseはドキュメント型のNoSQLです。
RDBの場合、保存するデータのことをレコードと言いますが、
ドキュメント型のNoSQLの場合、保存するデータのことを”コレクション”と言います。

使用方法は以下の通りです。

環境の準備

“pubspec.yaml”に必要なパッケージを追加します。

dependencies:

  flutter:
    sdk: flutter
  flutter_localizations: 
    sdk: flutter
  isar: ^3.1.0
  isar_flutter_libs: ^3.1.0

dev_dependencies:
  build_runner: ^2.3.3
  dart_code_metrics: ^5.4.0

  flutter_lints: ^2.0.0
  flutter_test:
    sdk: flutter
  isar_generator: ^3.1.0
  • isar: Isarデータベースのコアライブラリ
  • isar_flutter_libs: FlutterでIsarを使用するための追加ライブラリ
  • build_runner: Dartのコード生成を行うためのツール
  • isar_generator: Isarのコード自動生成ツール。モデルから必要なコードを自動生成します


コレクションの定義

どのようなデータを管理するのか定義します。
例として、ログイン等に使うユーザー情報を”user.dart”に定義してみます。

import 'package:isar/isar.dart';
import 'user.g.dart';

@collection
class User {
  // IDをIsarの機能で、自動インクリメント
  Id? id = Isar.autoIncrement;
  String? userName;
  String? eMail;
}

ルール1:@collection
定義の冒頭に”@collection”を記述します。
Isarがデータベースのテーブルとして認識するためのアノテーションです。
「ここにコレクション定義しています」という目印です。

ルール2:ユニークなID
コレクションを定義する際、一意に認識できるIDを必ず設定する必要があります。
今回はidに”Isar.autoIncrement”を使用しています。
Isar.autoIncrementを使用すると、Isarが自動的にユニークなIDを割り振ります。

インポートしている”user.g.dart”は、この時点では存在しません。
以下コードをターミナルで実行することで”user.g.dart”が作成されます。

flutter pub run build_runner build --delete-conflicting-outputs


コレクションの登録

挿入したいデータ用のオブジェクトを作成し、putすることでコレクションを挿入できます。

final user = User()
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

await isar.users.put(user);
usersについて

isar.users.putの”users“とはなんでしょうか?

自動生成される”user.g.dart”よって、userコレクションのための、
usersメソッドが定義されています。
usersメソッドは、userコレクションに対し何か操作する場合に利用します。

定義したコレクションがItemならItemsです。
もし、メソッド名が分からない場合は”xxx.g.dart”を参照してみましょう。

コレクションの更新

コレクションの更新は登録時と同じputを使用します。
IDを持つオブジェクトを作成し、putすることで更新できます。
この時にIDが既に存在する場合はコレクションの更新が行われ、存在しない場合は挿入されます。

final user = User()
  ..id = 123
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

await isar.users.put(user);


コレクションの削除

コレクションの削除は、IDを指定しdeleteを実行します。

await isar.users.delete(123);


トランザクション処理

コレクションの登録、更新、削除は通常、トランザクション処理で実行します。

final user = User()
  ..id = 123
  ..userName = 'John Doe'
  ..eMail = 'john@example.com';

// 以下の処理が全てコミットした場合、DBが更新される
await isar.writeTxn(() async {
  await isar.users.put(user);
  await isar.users.delete(123);
});


コレクションの取得

コレクションの取得方法は色々あります。

// 全てのUserコレクションの取得
final user = await isar.users;

// ID"123"のUserコレクションの取得
final user = await isar.users.get(123);


Filter句の使い方

Filter句はコレクションの要素に対して、条件を指定し検索することができます。

// eMailに"@example.com"が含まれているものを取得
final users = await isar.users
 .filter()
 .emailcontains('@example.com')
 .findAll();
  //※"findAll()"は合致する全てのコレクションを取得する

Where句の使い方

Where句はindexを設定している要素にのみ、条件として使用することができます。
逆にFilter句はどの要素に対しても利用できますが、Where句の方が処理が高速です。

例えば、user.dartが以下のようなコレクションを定義していた場合

import 'package:isar/isar.dart';
import 'user.g.dart';

@collection
class User {
  Id? id = Isar.autoIncrement;
  String? userName;

  // 年齢という要素にインデックスを設定
  @Index()
  String? age;

  String? eMail;
}

以下のようなWhere句が設定できます。

// 年齢が30歳のコレクションを取得
final user = await isar.users
  .where()
  .ageEqualTo(30)
  .findAll();

// 年齢が30歳以上のコレクションを取得
final user = await isar.users
  .where()
  .ageGreaterThan(30)
  .findAll();

“ageEqualTo”や”ageGreaterThan”のパラメーターは
自動生成された’user.g.dart’に定義されています。

公式サイトの紹介

今回説明した内容以外にも、Isar Databaseは様々な使い方ができます。
気になる方は公式サイトを参照ください。
公式サイト:https://isar.dev/ja/schema.html

タイトルとURLをコピーしました