すらぼうの開発ノート

flutterエンジニアのメモ

【Flutter】hiveの使用方法

本エントリではhiveを使ったデータ管理方法を説明する。



hiveについて

特徴

  • 動作が軽量
  • キーバリュー型NoSQLデータベース
  • boxという単位でデータを管理

パフォーマンス

hiveの公式リポジトリにはsqfliteshared_preferencesとのパフォーマンスの比較が掲載されている。

1000回連続でデータ読み取り、生成を行なった結果が上画像。 いずれもhiveはその他のパッケージと比べて処理時間が短く この操作ではパフォーマンスが良いことが示されている。

公式リンク

pub.dev

docs.hivedb.dev


基本的な使用方法

実装の流れ

hiveを使用する基本的な流れは以下。非常にシンプル。

  • pubspec.yamlを更新してインストール
  • Hive.initFlutter()hiveにデータの保存先を認識させる
  • Hive.openBox( boxの名前 )でboxを開く
  • ValueListenableBuilderでboxを使用したいウィジェットをラップ
  • put()get()などのメソッドでデータを処理

以降上から順に説明する。

また説明用として公式ドキュメントのFavorite Booksアプリを用いる。 Favorite Booksのリポジトリこちら。各説明では必要な箇所のみを抜粋した。

pubspec.yamlを更新してインストール

hiveサードパーティのパッケージなので使用する際にはpubspec.yamlに以下を記述する。

dependencies:
  hive: ^2.2.3
  hive_flutter: ^1.1.0

Hive.initFlutter()hiveにデータの保存先を認識させる

main()関数内でアプリ起動直後に実行していることが多い。 この処理でhiveにデータの保存先を認識させる。

Hive.openBox( boxの名前 )でboxを開く

この処理もmain()関数内でアプリ起動直後に実行していることが多い。 openBox()の引数にはboxの名称が入る。boxの名称は何度も使用するので定数として定義すると楽。

ValueListenableBuilderでboxを使用したいウィジェットをラップ

ValueListenableBuilderでboxが必要なウィジェットをラップする。

valueListenableにはValueListenable<Box<T>>型のインスタンスを渡す必要があるので、listenable()メソッドで作成する。 実際にboxからデータを使用するにはbuilderプロパティ内で匿名関数の第二引数boxを利用する。

put()get()などのメソッドでデータを処理

boxで管理しているデータを利用するにはput()get()delete()プロパティを使用する。 それぞれの記述方法は以下。

put()

boxに値を挿入する。もし既にキーが存在する場合は値が更新される。 文法は以下の通り。

boxインスタンス.put(キー名称, 値);

favorite booksアプリでは以下の箇所で使用している。

公式ドキュメントの説明は以下。

docs.hivedb.dev

get()

boxからキー名称で指定した値を取得する。キーが存在しない場合はnullが返される。 文法は以下の通り。

boxインスタンス.get(キー名称);

favorite booksアプリでは使用していない。 公式ドキュメントの説明は以下。

docs.hivedb.dev

delete()

box内のキー名称で指定した値を削除する。

boxインスタンス.delete(キー名称);

favorite booksアプリでは以下の箇所で使用している。

公式ドキュメントの説明は以下。

docs.hivedb.dev


ユーザー定義クラスを用いた場合使用方法

hiveを用いてユーザー定義クラスを扱う場合、TypeAdapterを用いてクラスをhiveが認識できるようにする必要がある。

このTypeAdapterの実装はフルスクラッチで書くこともできるが、一般的にはbuild_runner を用いた実装の方が楽。

本エントリではbuild_runnerを用いた実装を説明する。手順は以下。

  • pubspec.yaml更新
  • ユーザー定義クラスに追記
  • build_runnerの実行
  • ユーザー定義クラスをhiveへ登録

pubspec.yaml更新

hive_generatorbuild_runnerをインストールする。 インストール時には最新バージョンを確認。

dev_dependencies:
  ...
  hive_generator: ^1.1.1
  build_runner: ^2.1.5

ユーザー定義クラスに追記

以下のユーザー定義クラスを例に説明する。

このPersonクラスをhiveに認識される形にするため、以下のように記述する。

このコードのポイントを説明を行う。

partキーワード

part 'person.g.dart';

partはファイルを分割する際に用いられるキーワードで、person.g.dartperson.dartの一部だという意味。 person.g.dartbuild_runnerを実行した際に自動で作成されるファイル。 一般的にbuild_runnerで自動作成(generate)されたファイル名には```.g````が付く。

@HiveType(typeId: )

@HiveType(typeId: 1)

はこのユーザー定義クラスをhiveが認識するためのキーワード。 クラス名の先頭につける。

このように@で始まるキーワードはannotationと呼ばれる。

typeIdプロパティに渡す数字はこちら,-Annotate%20all%20fields)に記載されている通り、0~223の数値を渡す。この数値は他のクラスと重複してはダメなので、hiveに登録できるユーザー定義クラスは224個という制限がある。

@HiveField()

@HiveField(0)はユーザー定義内のプロパティにそれぞれ付けるannotaiton。 括弧内に渡す数値はプロパティごとにクラス内でユニークであれば良いとのこと。

build_runnerの実行

ターミナルなどのCLIで以下のコマンドを実行する。

flutter packages pub run build_runner build

これでperson.g.dartperson.dartと同じディレクトリに生成される。

ユーザー定義クラスをhiveへ登録

HiveクラスのメソッドregisterAdapter()を用いてPersonクラスをhiveに認識させる。 次のようにmain()の中で実行されることが多い。

以上でユーザー定義クラスをhiveで扱うことができる。


hive以外のデータ管理パッケージ

Flutterにはhive以外にもデータを永続化して管理する手段がある。 以下のパッケージがhive以外の候補として上がることが多い。

  • sqflite
  • shared_reference

これらの使用方法などについては以下のエントリでまとめている。

note-tmk.hatenablog.com

note-tmk.hatenablog.com