Table of Contents
はじめに
FundastA Inc.の鈴木です。
現在、一部の業務の中でFlutterを活用したアプリの開発を行っています。
その中でFlutterのDBを作成する際にHiveを使用して、開発を行ったので備忘録として、記録しておきます。
Hiveとは
まずHiveとは何なのか
- NoSQL
- SQLiteよりも高速に読み取り、書き込みができる。
- SharedPreferencesよりも書き込みが優れている。
- モバイルやデスクトップ、ブラウザなど様々なプラットフォームに対応しているため、複数の動作環境に対応することができる。(クロスプラットフォーム)
この特徴は、DartのHiveの説明にも書いてありますので、ご確認いただければと思います。
リンク:https://pub.dev/packages/hive
Hiveを選んだ理由
今回Hiveを選んだ理由は、2つあります。
1つ目は、データの読み書きが高速であり、ドキュメントがわかりやすいから
2つ目は、SQLiteに比べてコードを書く量が少なくて済むかも。。。
以上の2つです。
コード量が少なく済むならその方が良いと思ったので、採用しました。
Hive導入・設定方法
1.パッケージの依存関係
1 2 3 4 5 6 7 8 |
dependencies: hive: ^1.4.4+1 hive_flutter: ^0.3.1 path_provider: ^1.6.7 dev_dependencies: hive_generator: 0.8.2 build_runner: ^1.10.11 |
以上のパッケージをpubspec.yamlに追加します。
2.初期化コード
1 2 3 4 5 |
void main() async{ // Hiveの初期化 await Hive.initFlutter(); runApp(MyApp()); } |
void main() {}の中に初期化コードを書きます。
3.モデルとアダプターの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import 'package:hive/hive.dart'; part 'database.g.dart'; @HiveType(typeId: 0) class Person extends HiveObject { @HiveField(0) String name; //名前 @HiveField(1) String furigana; //フリガナ Person(this.name, this.furigana); } /// Boxを内包するクラス /// Singletonやboxを開くのを非同期で待つのに使う /// Boxのファイル名を間違えないようにするためにもこれを起点にアクセスすることとする class RecordModelBox { Future<Box> box = Hive.openBox<Person>('record'); /// deleteFromDiskをした後はdatabaseが閉じてしまうため、もう一度開くための関数 Future<void> open() async { Box b = await box; if (!b.isOpen) { box = Hive.openBox<Person>('record'); } } } |
@HiveTypeの箇所は皆さんがDatabaseに設定したいデータを入れてください。
4.アダプタークラスの作成
1 |
$ flutter pub run build_runner build |
ターミナルで上記のコマンドを打つことでdatabase.g.dartファイルがdatabase.dartと同じディレクトリの場所に作成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
// GENERATED CODE - DO NOT MODIFY BY HAND part of 'database.dart'; // ************************************************************************** // TypeAdapterGenerator // ************************************************************************** class PersonAdapter extends TypeAdapter<Person> { @override final int typeId = 0; @override Person read(BinaryReader reader) { final numOfFields = reader.readByte(); final fields = <int, dynamic>{ for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return Person( fields[0] as String, fields[1] as String, ); } @override void write(BinaryWriter writer, Person obj) { writer ..writeByte(2) ..writeByte(0) ..write(obj.name) ..writeByte(1) ..write(obj.furigana); } @override int get hashCode => typeId.hashCode; @override bool operator ==(Object other) => identical(this, other) || other is PersonAdapter && runtimeType == other.runtimeType && typeId == other.typeId; } |
※注意点
このファイルは勝手に編集し、使用することができません。
database.dartを編集したら随時ターミナルでコマンドを打ち、上記ファイルを作成してください。
Hiveの使用方法
1.アダプターをHiveに登録
1 2 3 4 5 6 7 8 9 10 |
void main() async{ // Hiveの初期化 await Hive.initFlutter(); // カスタムアダプターの追加 Hive.registerAdapter<Person>(PersonAdapter()); //追加 //personsデータベースを開く var persons = await Hive.openBox('record'); //追加 runApp(MyApp()); } |
2で記載したvoid main()にカスタムアダプタの追加をしてください。
ここまででデータベースの準備は完了です。
※var persons = await Hive.openBox(‘record’);は、データボックスを開けなければ使用できないので、openメソッドを使用して開きます。
2.データベースの追加、削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
class _TodoListPageState extends State<TodoListPage> { var persons; List<dynamic> list = []; @override void initState() { super.initState(); initializePerson(); } void initializePerson() async{ persons = await Hive.openBox('record'); var suzuki = Person('鈴木','スズキ'); var tanaka = Person('田中','タナカ'); var satou = Person('佐藤','サトウ'); persons.addAll([suzuki, tanaka, satou]); //DBに全て追加 } list = persons.values.toList(); print(list); setState(() { }); } ~~widget等を書いていく~~ list[index].add(); //追加 list[index].delete(); //削除 list[index].save(); //保存 } |
今回はlistの中にDBの中身を挿入しました。理由はlistにしておくと扱いやすいからです。
追加や削除の使用方法としては、動作させたい変数にget、deleteなどのメソッドを使用すれば、簡単に動作します。
おわりに
今回、初めてFlutterを触れ、Hiveを使用しました。
Hiveはモデルに書くコード量がとても少なく、スッキリした形で作成できると感じました。また追加や削除も簡単にできるため、とても扱いやすいと感じました。
今後さらにFlutterを触り、知識を身に着けていければと考えています。
参考文献
・Hive公式ドキュメント:https://docs.hivedb.dev/#/
・Dart Hive:https://pub.dev/packages/hive
・Qiita:Flutterでお手軽にNoSQLでデータ保存:https://qiita.com/kasa_le/items/f39d759741c736f1d600