Flutter 개발을 하다보면 로컬 Database 를 사용해야 하는 경우가 종종 생긴다.
Hive 는 No SQL 기반 Database 를 제공한다.
사용자가 주소를 검색하고 선택한 주소를 데이터로 가지고 있는 기능을 만들어 보자. 데이터를 저장하기 위해 firebase나 Server에 저장하는 방법을 사용할 수도 있겠지만, 여기에서는 Hive를 통해 로컬에서 저장한다.
이 곳 을 참고하되 아래의 두 명령어로 설치하자. 설명이 완전하지 않다.
flutter pub add hive flutter pub add hive_flutter
이 곳을 참고하여 build runner를 설치
dart pub add build_runner --dev
이 곳을 참고하여 hive_generator를 설치
dart pub add hive_generator
Hive에는 모든 primitive 타입과 List, Map, DateTime, BigInt,Uint8List를 저장할 수 있다. 그리고 TypeAdapters를 사용한 객체(Object)도 저장 할 수 있다.
runApp을 하기에 앞서 init을 해주어야 한다.
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
//hive 초기화
await Hive.initFlutter();
return runApp(const MyApp());
}
이제 model를 만들어 보자. 먼저 hive를 import 한다. 그리고 fav_address_model.g.dart를 추가한다. 자동으로 생성되는 파일이다.
@HiveType()을 사용하여 Hive가 이 클래스가 TypeAdapter라고 인식하게 만든다. typeId는 Hive가 올바른 Adapter를 찾는데 사용되는 식별값이며 중복되서는 안된다.
0 부터 223 사이의 값만 가능하다.
// fav_address_model.dart
import 'package:hive/hive.dart';//add
part 'fav_address_model.g.dart';//fav_address_model.dart 과 동일하게 하고 g를 삽입
///관심지역 모델
(typeId : 0)//typeId는 중복되면 안됨.
class FavAddressModel {
FavAddressModel({
required this.isSelected,
required this.cityKr,
required this.cityEn,
required this.detailAdd,
required this.checkArlarm,
});
///선택된 도시 여부
(0)
bool isSelected;
///도시 이름(kr)
(1)
String cityKr;
///도시 이름(en)
(2)
String cityEn;
///상세 주소
(3)
String detailAdd;
///알림 여부
(4)
bool checkArlarm;
}
위와 같이 model에 대한 작성이 완료 되면 다음 명령을 실행한다.
flutter packages pub run build_runner build
ChatGPT 님은 위대하다
TypeAdapter는 Flutter에서 JSON 데이터를 파싱할 때 사용되는 기능입니다.
JSON 데이터를 사용하여 Dart 객체를 만들기 위해서는, 해당 데이터의 형식을 이해하고 객체에 맞게 변환해야 합니다.
이를 위해 TypeAdapter는 JSON 데이터를 Dart 객체로 변환할 수 있는 방법을 제공합니다.
TypeAdapter는 JSON 데이터를 파싱하는 데 필요한 로직을 포함하고 있습니다.
이를 통해, JSON 데이터의 각 필드에 대해 올바른 유형의 값을 할당할 수 있습니다.
예를 들어, JSON 데이터에서 숫자 값을 가져와서 Dart 객체의 정수 필드에 할당하는 등의 작업을 수행할 수 있습니다.
Flutter에서는 TypeAdapter를 사용하여 JSON 데이터를 파싱하는 라이브러리인 json_serializable과 built_value 등이 제공됩니다.
이러한 라이브러리를 사용하면, Dart 객체와 JSON 데이터 간의 변환을 보다 쉽게 처리할 수 있습니다.
이제 만들어진 fav_address_model.g.dart 을 확인해보자. FavAddressModelAdapter가 만들어진 것을 확인할 수 있다.
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'fav_address_model.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class FavAddressModelAdapter extends TypeAdapter<FavAddressModel> {
final int typeId = 0;
FavAddressModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return FavAddressModel(
isSelected: fields[0] as bool,
cityKr: fields[1] as String,
cityEn: fields[2] as String,
detailAdd: fields[3] as String,
checkArlarm: fields[4] as bool,
);
}
void write(BinaryWriter writer, FavAddressModel obj) {
writer
..writeByte(5)
..writeByte(0)
..write(obj.isSelected)
..writeByte(1)
..write(obj.cityKr)
..writeByte(2)
..write(obj.cityEn)
..writeByte(3)
..write(obj.detailAdd)
..writeByte(4)
..write(obj.checkArlarm);
}
int get hashCode => typeId.hashCode;
bool operator ==(Object other) =>
identical(this, other) ||
other is FavAddressModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
이 Adapter를 사용하려면 Hive에 등록하여야 한다.
```dart
import 'package:hive/hive.dart';
import 'package:hive_flutter/hive_flutter.dart';
void main() async {
//hive 초기화
await Hive.initFlutter();
Hive.registerAdapter(FavAddressModelAdapter());//Here!!
return runApp(const MyApp());
}
https://docs.hivedb.dev/#/
https://pub.dev/packages/hive/install
https://developerb2.medium.com/typeadapters-in-hive-flutter-a7565f75ad6d