Flutterで爆速ローカルDBを実現。「isar」

今回は、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を試してみてください。

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