💾

Flutter で NoSQL の Hive を利用して永続化をする

2021/01/19に公開

導入

以下の4つを pubspeck.yaml に追加します
hive
hive_flutter
hive_generator
build_runner

dependencies:
  flutter:
    sdk: flutter
  hive: ^1.4.4+1
  hive_flutter: ^0.3.1

dev_dependencies:
  flutter_test:
    sdk: flutter

  hive_generator: ^0.8.2
  build_runner: ^1.10.13

Entityを作成する

  1. part '{Entity名}.g.dart' を追加します。
  2. @HiveType アノテーションを追加します。typeIDで指定した値がModelごとの識別子となるようです。
  3. カラムのようなイメージで各プロパティに @HiveField アノテーションを追加します。
part 'ShoppingItem.g.dart';

(typeId: 1)
class ShoppingItem {
  ShoppingItem(this.name, this.checked);

  (0)
  final String name;

  (1)
  final bool checked;
}

Adapter を作成する

以下のコマンドでAdapterを自動生成してもらいます。ここで最初に導入した hive_generator, build_runner が活躍します。

$ flutter pub run build_runner build

Hive の初期設定

  1. Hive.initFlutter() で初期化します
  2. 作成したAdapterをセットします
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';

void main() async {
  // Hiveの初期化
  await Hive.initFlutter();
  Hive.registerAdapter(ShoppingItemAdapter());

  runApp(KMShoppingList());
}

読み書き

オブジェクトの場合

final shoppingItem = ShoppingItem(inputText.first, false);
final box = await Hive.openBox<ShoppingItem>('shoppingItem');
// 永続化
box.add(shoppingItem);
// 取り出し
final shoppingItems = box.values.toList();

値の場合(mapで扱います)

// 一度openBoxで開いたboxは await なしの box で参照できるようです
final box = Hive.box('names');
box.put('name', 'みなみ');
var name = box.get('name');

参考

Discussion