【Flutter】Hiveを使ってデータをローカルに保存する方法まとめ。複数Hiveを使う場合も紹介

こんにちは!本記事では、データを端末ローカルに保存するパッケージHiveについて、実装方法も含めてまとめていきます。この記事と関連記事を一通り読めば、自身のアプリに実装できるはずです。

目次

Hiveの長所

ローカル保存ができるパッケージの比較はこちらの記事でしています。とても詳しく違いをまとめているため詳細はこちらで確認ください。Hiveの長所についてまとめると以下の通りです。

幅広いアプリで使用可能

モバイルやwebアプリ、デスクトップなどで対応しています。

ドキュメントがわかりやすい

基本的には以下の2つのページを見れば大体使えるようになります。

Reso Coder
Hive (Flutter Tutorial) – Lightweight & Fast NoSQL Database - Reso Coder Subscribe Get the f​ull project Storing data locally is a task which has to be done by almost every app. Maybe, you want to cache responses from a REST API or y...
あわせて読みたい
Hive Docs Description

さまざまな型を入れることが可能

List, Map, DateTime, Unit8List等、基本何でも保存できます。自分のオリジナルのクラスも保存できます。

*Isarというパッケージが、Hiveのバージョンアップ版として出ているらしいです。こちらにも注目したいところではあります。

Hiveの実装手順

Hiveを実際にアプリ内で使用する手順についてまとめます。

①パッケージのインストール

ターミナルで、下記の通り打ち、最後にflutter pub getを実行します。

$ flutter pub add hive
$ flutter pub add hive_flutter
$ flutter pub add hive_generator --dev
$ flutter pub add build_runner --dev
あわせて読みたい
【Flutter】パッケージをインストール/アンインストールする方法について~コマンドと一緒に紹介 パッケージとは、Widgetをまとめたものです。目的に沿ったパッケージを導入することで完成されたWidgetを使って簡単に開発ができるため、手間が大幅に短縮されます。 本...

②Boxの中に入れるクラスの作成

新規Dartファイルを作り、ローカル保存したいデータを@HiveType、@HiveFieldを使って宣言します。例えば、Questionというクラス内にquestionの文とint型の値answerを記録する場合は、下記のように記します。

この次の手順で、question.g.dartというファイルを生成するため、part 'question.g.dart';を書いておきます。

これを書いた直後はエラーが出ていますが、次の手順で消えるので大丈夫です。

import 'package:hive/hive.dart';
part 'question.g.dart';
    @HiveType(typeId: 1)
class Question {
      @HiveField(0)
      String question;

      @HiveField(1)
      int answer; 
      Question({required this.question, required this.answer});

    }

③ g.dartファイルの作成

ターミナルで下記のように打ちます。実行した後に、手順②で作成したファイルと同じ場所に.g.dartファイルが作成されていることを確認してください(数秒後くらいに出てきます)

$ flutter packages run build_runner build

ファイルができない場合は、元々のdartファイルと宣言している.g.dartファイルの名前が一致していることを確認してください。
例:question.dartだったらquestion.g.dartを作成するようにする

④Hiveを立ち上げ、箱を開ける

hive、path_provider、先ほど作成したdartファイルをimportします。

さらに、アプリを立ち上げる箇所のvoid main()で、下記を追記します。

import 'package:hive/hive.dart';
import 'Models/question.dart';
import 'package:path_provider/path_provider.dart';

late Box box;

void main() async{
WidgetsFlutterBinding.ensureInitialized();
  var dir = await getApplicationDocumentsDirectory();
  Hive.init(dir.path);
  Hive.registerAdapter(QuestionAdapter());
  box = await Hive.openBox("questionBox");
  runApp(const MyApp());
}

実行中に下記のようなエラー文が出た場合は、Xcode側のPodfileで要求バージョンを更新してください。

あわせて読みたい
【Flutterエラー解決法】”Automatically assigning platform ‘iOS with version ‘9.0... こんにちは!本記事では、下図のようなエラー文が出た場合の対処方法についてまとめておきます。 エラー文は以下の通り。iOS platformのバージョンをちゃんと特定してね...

Hiveで開けたい箱が2個以上ある場合

開けたい箱が2個ある場合、上記のように同じことを打っても上手く開けることができません。

下記のようにBoxListを作るとうまくいきました。

List<Box> boxList = [];
Future<List<Box>> _openBox() async {
  var dir = await getApplicationDocumentsDirectory();
  Hive.init(dir.path);
  var boxa = await Hive.openBox("box_a");
  var boxb = await Hive.openBox("box_b");
  boxList.add(boxa);
  boxList.add(boxb);
  return boxList;
}

void main() async {
  Hive.registerAdapter(RecordHiveAdapter());
  Hive.registerAdapter(GoalHiveAdapter());
  await _openBox();
  runApp(const MyApp());
}

Apple M1はPod installがそのままだと機能しないようです。下記の記事を参考にしてください。
sudo gem install ffiは、sudo arch -x86_64 gem install ffiと書いてください。

みんプロ式 - 初心者専門Flutterで...
[Flutter/iOS]Appシリコン(M1)のMacでpod installしたら「Illegal instruction at・・」というエラーが出... Appシリコン(M1)のMacで、ターミナルから「pod install」すると、以下のような超長いエラーが出て失敗してしまう場合があります。

まとめ・関連記事

↓特に動画がわかりやすかったです。

Reso Coder
Hive (Flutter Tutorial) – Lightweight & Fast NoSQL Database - Reso Coder Subscribe Get the f​ull project Storing data locally is a task which has to be done by almost every app. Maybe, you want to cache responses from a REST API or y...
よかったらシェアしてね!

コメント

コメントする

CAPTCHA


目次
閉じる