アプリの設計において、特定のデータを永久的に保存する必要があります。
その際にユーザーのスマホ内に作成されるローカルDBを設計します。
ローカルDBは様々なパッケージが存在しますが、
今回は、高速なローカルDBのパッケージ”Isar Database“について紹介します。
Isar Databaseとは?
Isar DatabaseはFlutter向けの高速なクロスプラットフォームデータベースです。
アプリの永続的に保存したいデータがある場合に利用するローカルDBです。
他にもローカル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“とはなんでしょうか?
usersメソッドは、userコレクションに対し何か操作する場合に利用します。
自動生成される”user.g.dart”よって、userコレクションのための、
usersメソッドが一緒に自動で定義されます。
ユーザーが定義したコレクション名によって、こちらのコレクション名も変化します。
例えば、定義したコレクションが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);
});
コレクションの取得
コレクションの取得方法は色々あります。
getを使った取得
// 全ての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