今回は、Flutterで使える超高速ローカルデータベース「isar」について解説します。
モバイルアプリでデータの永続化をしたいとき、SQLiteやHiveを使ったことがある人も多いと思いますが、「isar」はそれらの選択肢に次ぐ、あるいは上回るパフォーマンスと使いやすさを持つ注目のパッケージです。
isarとは?
isar(イサール)は、Dart/Flutter向けに最適化されたNoSQLローカルデータベースです。
- 高速な読み書き性能(10万件以上でも爆速)
- 型安全で直感的なAPI
- オフライン対応はもちろん、インデックスやクエリも強力
- Web / Android / iOS / macOS / Windows / Linux 対応(Web対応があるのもポイント)
実際の開発でも「Hiveより高速」「SQLiteより簡単」といった声が多く、今後のFlutterアプリ開発では有力な選択肢の1つになるといえます。
インストール方法
まずはpubspec.yaml
に以下を追加します。
dependencies:
isar: ^3.1.0
isar_flutter_libs: any
path_provider: any
dev_dependencies:
isar_generator: any
build_runner: any
そして、モデルを定義するためにbuild_runner
を使ってコード生成します。
モデルの定義と基本操作
以下は簡単なTask
モデルの例です。
import 'package:isar/isar.dart';
part 'task.g.dart';
@Collection()
class Task {
Id id = Isar.autoIncrement;
late String title;
DateTime? dueDate;
bool isDone = false;
}
ポイントは以下のとおり。
@Collection()
でデータモデルを定義Id
型で自動的に主キーを設定- null許容もOK、型安全に扱える
コード生成
flutter pub run build_runner build
データベースの初期化と基本操作
初期化
final dir = await getApplicationDocumentsDirectory();
final isar = await Isar.open([TaskSchema], directory: dir.path);
データ追加
await isar.writeTxn(() async {
await isar.tasks.put(Task()
..title = 'Buy groceries'
..dueDate = DateTime.now().add(Duration(days: 1)));
});
データ取得
final tasks = await isar.tasks.where().findAll();
条件付き検索
final tasks = await isar.tasks
.filter()
.isDoneEqualTo(false)
.dueDateGreaterThan(DateTime.now())
.findAll();
更新・削除も同様に writeTxn() ブロックで行います。
isarの強みと注意点
強み
- クエリビルダーが型安全かつ直感的(.filter().xxxEqualTo() など)
- 複雑なクエリやソート、インデックスも簡単に使える
- リアクティブなデータ更新も対応(
.watch()
でStream監視)
注意点
- モデルの変更時には毎回
build_runner
を再実行する必要がある - 型を厳格に扱うので、柔軟性よりも安全性重視(自由すぎるNoSQLに慣れてると最初戸惑うかも)
- Web対応の際は制限あり(IndexedDBベースでややパフォーマンスが落ちる)
まとめ
isarは、Flutterでローカルデータベースを扱う上で非常に優秀な選択肢です。特に以下のようなアプリで威力を発揮します。
- TODOリストなどの軽量データ管理アプリ
- チャットや日記などオフライン性の高いアプリ
- 複数デバイス対応(Web, モバイル, デスクトップ)を見据えたアプリ
「Hiveではちょっと物足りない」「SQLiteは設定が面倒」という方は、ぜひ一度isarを試してみてください。