Closed11

hiveのドキュメントを読んだチラ裏

ken1flanken1flan

Box

  • 何でも入れられる箱。RDBMSのテーブルに近くもできるけど、ゆるい。
  • type parameterで入れるものを制限することもできる。
ken1flanken1flan

読み書き

読み込み

  • Boxからデータを取り出すには、キーを指定する。
  • 同じキーからは同じインスタンスが取得される。

書き込み

  • マップと同じように扱う。
  • putで即座に書き込まれる。他で参照している場合は書き込み終了前なら前の値が…みたいなことを自動でやってくれる。
  • lazy boxという違うものもある。

削除

  • deleteで消す。
ken1flanken1flan

Flutter対応

保存場所

  • iOS、Androidで異なる場所に保存するが、hive_flutterパッケージのinitFlutterで隠蔽される。

データが更新されたときのウィジェットの更新

ValueListenableBuilderをbuilderにかぶせて…みたいな使い方っぽい。
割と便利かも。

ken1flanken1flan

オートインクリメントとインデックス

あるって。

ken1flanken1flan

カスタムオブジェクト

  • カスタムなものもTypeAdapterで使える
    • プリミティブな型はすべて対応しているが、カスタムなものもTypeAdapterでできる。
    • ほぼどんなクラスもOK。
  • クラスの定義の更新ができる。
  • 列挙型を定義できる
  • HiveObjectから派生して作ると、カスタムなタイプは扱いが楽
  • HiveListで関連が作れる
ken1flanken1flan

チュートリアル

  • ダークモード
  • 好きな本
  • スケッチパッド
  • 連絡先
    • Hive.openBox(contactsBoxName) ではなくて Hive.openBox<Contact>(contactsBoxName)
    • 型を指定しないと、Hive.box<Contact>(contactsBoxName).listenable()The box "contacts" is already open and of type Box<dynamic>. というエラーになる。
    • https://github.com/hivedb/hive/issues/334
ken1flanken1flan

高度な

Lazy Box

小〜中規模のときには普通のBoxでよいけど、大規模になったときにキーだけメモリに展開して、値は実際に必要になったときに読み込むやり方を取れるLazyBoxを使うとよさそう。

Encrypted Box

データの値を暗号化して保存する。
キーは暗号化されない。

圧縮

hiveは追加専用のデータストアなので、書き込み削除を繰り返しているとファイルサイズが肥大化する。
そこで、削除された穴を詰めるcompactをやると、起動時間の削減に役に立つ。
自動的に圧縮するルールを設定することもできる。

ken1flanken1flan

ベストプラクティス

  • hiveにはクエリ言語がない。Dartにやらせると速い。
  • キーオーダーは辞書順。逆順も指定可。カスタムキーオーダーも定義できる。
  • リストの保存の仕方は配列でまとめて保存と、ひとつずつ追加する方法がある。
  • アイテムのフィルタリングがある。クエリ言語がないけど、これがあれば十分そう。
ken1flanken1flan

全体を眺めての感想

  • Elastic Searchを思い出した。boxはRDBMSのテーブルよりはElastic Searchのindexと思ったほうが近そう。
    • 親子関係のあるデータはひとつのindex/boxに入れるべきとか、tipsが似ていそう。
  • クエリはないが、フィルタはあるので、アプリを作るには十分かも。複雑なリポジトリパターンを書かなくてもよさそう。
このスクラップは2022/02/28にクローズされました