こんにちは!本記事では、データを端末ローカルに保存するパッケージHiveについて、実装方法も含めてまとめていきます。この記事と関連記事を一通り読めば、自身のアプリに実装できるはずです。
Hiveの長所
ローカル保存ができるパッケージの比較はこちらの記事でしています。とても詳しく違いをまとめているため詳細はこちらで確認ください。Hiveの長所についてまとめると以下の通りです。
幅広いアプリで使用可能
モバイルやwebアプリ、デスクトップなどで対応しています。
ドキュメントがわかりやすい
基本的には以下の2つのページを見れば大体使えるようになります。
さまざまな型を入れることが可能
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
②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で要求バージョンを更新してください。
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
と書いてください。
まとめ・関連記事
↓特に動画がわかりやすかったです。
コメント