Hive

Clean Code Big Poo·2023년 4월 22일
0

Flutter

목록 보기
30/38
post-thumbnail

Overview

Flutter 개발을 하다보면 로컬 Database 를 사용해야 하는 경우가 종종 생긴다.
Hive 는 No SQL 기반 Database 를 제공한다.

  • Flutter APP 뿐만 아니라, Desktop, browser 에서 사용할 수 있다.
  • 성능이 우수하고 빠르다.
  • 간단하고 강력한 API 지원
  • 강력한 암호화 기능이 기본적으로 적용
  • Native 의 의존성이 없다.
  • SQLite, Shared Prefrence보다 읽고 쓰는 것이 빠르다.

사용자가 주소를 검색하고 선택한 주소를 데이터로 가지고 있는 기능을 만들어 보자. 데이터를 저장하기 위해 firebase나 Server에 저장하는 방법을 사용할 수도 있겠지만, 여기에서는 Hive를 통해 로컬에서 저장한다.

Install

dependencies

이 곳 을 참고하되 아래의 두 명령어로 설치하자. 설명이 완전하지 않다.

flutter pub add hive
flutter pub add hive_flutter

dev_dependencies

이 곳을 참고하여 build runner를 설치

dart pub add build_runner --dev

이 곳을 참고하여 hive_generator를 설치

dart pub add hive_generator

Usage

Hive에는 모든 primitive 타입과 List, Map, DateTime, BigInt,Uint8List를 저장할 수 있다. 그리고 TypeAdapters를 사용한 객체(Object)도 저장 할 수 있다.

init

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

이제 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

What is TypeAdapter in flutter

ChatGPT 님은 위대하다

TypeAdapter는 Flutter에서 JSON 데이터를 파싱할 때 사용되는 기능입니다. 
JSON 데이터를 사용하여 Dart 객체를 만들기 위해서는, 해당 데이터의 형식을 이해하고 객체에 맞게 변환해야 합니다. 
이를 위해 TypeAdapter는 JSON 데이터를 Dart 객체로 변환할 수 있는 방법을 제공합니다.

TypeAdapter는 JSON 데이터를 파싱하는 데 필요한 로직을 포함하고 있습니다. 
이를 통해, JSON 데이터의 각 필드에 대해 올바른 유형의 값을 할당할 수 있습니다. 
예를 들어, JSON 데이터에서 숫자 값을 가져와서 Dart 객체의 정수 필드에 할당하는 등의 작업을 수행할 수 있습니다.

Flutter에서는 TypeAdapter를 사용하여 JSON 데이터를 파싱하는 라이브러리인 json_serializable과 built_value 등이 제공됩니다. 
이러한 라이브러리를 사용하면, Dart 객체와 JSON 데이터 간의 변환을 보다 쉽게 처리할 수 있습니다.

registerAdapter

이제 만들어진 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());
}

write

read

remove

참고

https://docs.hivedb.dev/#/
https://pub.dev/packages/hive/install
https://developerb2.medium.com/typeadapters-in-hive-flutter-a7565f75ad6d

0개의 댓글