하얀설표 블로그




dart, flutter hive 사용 방법(with adapter)





( 수정됨)


예시 코드

# 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/#/


공감 : 0







white.seolpyo.com