예시 코드
# models.dart
import 'package:hive/hive.dart';
part 'models.g.dart';
@HiveType(typeId: 0)
class Model extends HiveObject {
// @HiveField(index)
@HiveField(0)
int id;
@HiveField(1)
String name;
@HiveField(2)
List<int> array;
@HiveField(3)
DateTime dt = DateTime.now();
// print() 명령시 출력되는 문구
@override
String toString() => 'Model 객체는 다음과 같습니다. id: $id, name: $name, array: $array, dt: $dt, float: $float';
}
# handle.dart
import 'package:hive/hive.dart';
import 'package:example/Hive/models.dart';
void main() async {
var data = Model(4, '', [54123], 2.3)
..dt = DateTime(2021,2,22);
print('data: $data');
print('data.toString(): ${data.toString()}');
data.dt = DateTime(2022,2,22);
print('data: $data');
Hive.registerAdapter(ModelAdapter());
Hive.init('box');
var box = await Hive.openBox('box');
await box.put(data.id, data);
var data2 = Model(4, 'data2', [54123]);
print('data2: $data2');
await box.add(data2);
print('box.keys: ${box.keys}');
print('box.values: ${box.values}');
Model a = box.get(box.keys.first);
print('a: $a');
print('a.id: ${a.id}');
print(box.getAt(1));
print(box.get(5));
var data3 = Model(5, 'data3', [33]);
box.putAt(1, data3);
print(box.getAt(1));
box.close();
}
결과
data: Model 객체는 다음과 같습니다. id: 4, name: , array: [54123], dt: 2021-02-22 00:00:00.000
data.toString(): Model 객체는 다음과 같습니다. id: 4, name: , array: [54123], dt: 2021-02-22 00:00:00.000
data: Model 객체는 다음과 같습니다. id: 4, name: , array: [54123], dt: 2022-02-22 00:00:00.000
data2: data2
box.keys: (4, 5)
box.values: (Model 객체는 다음과 같습니다. id: 4, name: , array: [54123], dt: 2022-02-22 00:00:00.000, Model 객체는 다음과 같습니다. id: 4, name: data2, array: [54123], dt: 2023-12-12 16:08:32.143717)
a: Model 객체는 다음과 같습니다. id: 4, name: , array: [54123], dt: 2022-02-22 00:00:00.000
Model 객체는 다음과 같습니다. id: 5, name: data3, array: [33], dt: 2023-12-12 16:26:17.610
설명
models.dart를 통해 Model adapter를 생성했다.
현재 적용된 모델을 보면 id, name, array, dt 4개의 column이 있으며, 그 중 dt는 기본값이 Datetime.now()로 설정되어있다.
이로 인해 Model() 객체 생성시 dt 값은 입력하지 않아도 되며, 필요한 경우 Model Class의 dt값을 변경하는 것도 가능하다.
part 생성하기
어댑터 적용
Hive.registerAdapter(ModelAdapter()); 명령은 박스를 불러오기 전에 수행되어야 한다.
박스 불러오기
await Hive.openBox('box'); 명령을 통해 박스 db를 불러올 수 있으며, db를 불러오기 전 Hive.init('box'); 명령을 수행해줘야한다.
dart에서 실행하는 경우에는 Hive.init({box 파일 명}) 명령을, flutter인 경우에는 Hive.initFlutter({box 파일 명}) 명령을 수행줘야 한다.
db 추가하기
db 추가는 await box.put({key}, {data}); 과 await box.add({data}); 2가지 방법이 존재한다.
put은 key값을 수동으로 설정하는 것이고, add 명령은 코드가 알아서 key를 지정해준다.
db 조회하기
box.keys() 명령을 통해 db의 키 목록들을, box.vlaues() 명령을 통해 db의 데이터 내용들을 가져올 수 있다.
기본적으로 Map 객체와 비슷하다.
db 가져오기
box.get()과 box.getAt() 2가지 방법이 존재한다.
box.get()은 데이터의 key값을 기준으로 데이터를 가져오는 명령이고,
box.getAt()은 데이터의 list index값을 기준으로 데이터를 가져온다.
그 증거로 box.get(4)는 제일 처음 삽입한 데이터를 가져왔고, box.getAt(1)은 박스에 2번째 index를 가지고 있는 데이터를 가져왔다.
db 수정하기
box.put()과 box.putAt() 명령을 통해 데이터를 수정할 수 있다.
이전과 마찬가지로 put은 key값을 넣어줘야하고, putAt은 list index값을 기준으로 하니 사용에 주의를 요한다.
db 종료하기
box.close() 명령을 사용해 박스를 종료해줘야 한다.
이렇게 종료해주지 않으면 변경되 내용이 저장되지 않을 수 있으니 주의해야 한다.
참고 자료
Hive Document: https://docs.hivedb.dev/#/