flutter.dev

Hive

paulaner80 2021. 5. 25. 12:27
반응형

 

1. 디펜던시

 

defendency

  hive

  hive_flutter

 

dev_defendency

  build_runner

  hive_generator

 

 

 

2. 모델 생성

 

2-1. 코드작성

class WordModel

모델을 Hive에서 사용하려면 어노테이션을 사용해야함

@HiveType(typeId:1)   : 타입ID1부터 시작함.

@HiveField(0)

import 'package:hive/hive.dart';

part 'word_model.g.dart';

@HiveType(typeId: 1)
class WordModel{

  @HiveField(0)
  final int id;

  @HiveField(1)
  final String engWord;

  @HiveField(2)
  final String korWord;

  @HiveField(3)
  final int correctCount;

  WordModel({
    required this.id,
    required this.engWord,
    required this.korWord,
    required this.correctCount
  });
}

 

 

 

 

2-2. 코드제너레이션

flutter pub run build_runner build

 

 

WordModelAdapter  클래스가 생성됨.

Hive는 원시타입들과 List, Map DtateTime, Unit8List 타입을 지원합니다.

그 외 타입을 저장하기 위해서는 오브젝트를 바이너리로 컨버팅해주는 TypeAdapter를 등록해야합니다. typeadapter를 만들 때 typeId가 필요합니다. typeId 0~223 사이의 값입니다. 그리고 연속된 값을 사용해야합니다.

 

 

2-3. 어댑터 등록

void main()  async{
  await Hive.initFlutter();                 // 플러터 초기화
  Hive.registerAdapter(WordModelAdapter()); //adapter 등록
  await Hive.openBox<WordModel>('word');    //데이터베이스 사용.
  runApp(MyApp());
}

 

 

 

3. Hive 관련함수들

 

3-1. 함수들

Hive.initFlutter()  Hive 초기화

Hive.registerAdapter : 어댑터 등록 :

Hive.openBox<WordModel>(‘word’);

    => Hive.openBox를 한 이 후로는 Hive.box를 통해서 box를 가져올 수 있음.

 

box.put : 아이디 필요함.

   box.put(id, WordModel (id, engWord : ~~);

box.add : 아이디 필요 없음.

box.isNotEmtpy

box.length

box.get (key)

box.getAt (index)   인덱스는 변경이 될 수 있음. 리스트등을 사용할 때 사용할 수 있음

 

 

 

3-2. 값 삽입

    final box = Hive.box<WordModel>('word');

    int id = 0;
    if(box.isNotEmpty){
      final prevItem = box.getAt(box.length-1);

      if(prevItem!=null){
        id = prevItem.id+1;
      }
    }

    box.put(
      id,
      WordModel(
        id:id,
        engWord:engWord,
        korWord:korWord,
        correctCount : 0
      )
    );

 

 

 

 

3-3. 값 가져오기

body:Center(
        child:Padding(
          padding: EdgeInsets.all(16.0),
          child: ValueListenableBuilder(    //<<<< 이것으로 받음.
            valueListenable: Hive.box<WordModel>("word").listenable(),
            builder: (context, Box<WordModel> box, child) {  //<<<< box가 여기로 옴.
              return ListView.separated(
                itemBuilder: (context, index){
                  final item = box.getAt(index);   //<<<< box의 값을 꺼내서 사용
                  if(item==null){
                    return Container();
                  }else{
                    return WordCard(
                      onBodyTab: (){

                        ScaffoldMessenger
                            .of(context)
                            .showSnackBar(SnackBar(
                                content: Text("${item.korWord}")
                            )
                        );
                      },
                      onCheckTab:(){
                        var newModel = WordModel(
                          id:item.id,
                          engWord: item.engWord,
                          korWord: item.korWord,
                          correctCount: item.correctCount +1
                        );
                        
                        box.put(item.id, newModel);

                      },
                      engWord: item.engWord,
                      korWord: item.korWord,
                      correctCount: item.correctCount);
                  }
                },
                separatorBuilder: (context, index){
                  return Padding(
                    padding: EdgeInsets.only(bottom: 8.0),
                    child: Divider(),);
                },
                itemCount: box.length);
            }
          ),
        )
      )

'flutter.dev' 카테고리의 다른 글

dart 병렬처리  (0) 2021.07.13
json 파싱  (0) 2021.07.06
permission_handler 사용법  (0) 2021.04.12
[하는 중.]어셋과 이미지 추가하기  (0) 2019.11.26
Provider  (0) 2019.11.05