hive

나 안해·2023년 3월 21일
0

스트림을 사용하니까 기존의 RDBMS방식을 버려야 한다


0. hive?

No(=Not Only)sql database이면서 In Memory database

  • JSON을 받아와서 시리얼라이즈 후 DB에 저장되는 이전의 과정을 생략하고 바로 JSON으로 저장하는 방식
  • 현재 flutter에서의 DB는 hive가 가장 선호된다
  • 장점
    • 중간 과정이 없어서 빠르다
    • Key & Value 구조이기 때문에 인덱스가 없다
    • Lambda처럼 사용한만큼 사용료를 지불해서 비용절감 가능
      • RDS에 저장하지 않아서 좋다
  • 단점
    • JOIN 불가

      term

      • annotation == Python의 decorator
      • Adapter == crossEntity

1. 설치

  • package → pubspec.yaml 에 추가
    dependencies:
      hive: ^[version]
      hive_flutter: ^[version]
    
    dev_dependencies:
      hive_generator: ^[version]
      build_runner: ^[version]

2. 데이터 저장

2.1 Initalize

hive를 사용하기 위해서는 main.dart에서 초기화가 필수

    import 'package:hive_flutter/hive_flutter.dart';

    await Hive.initFlutter();
    ※ 모바일 앱이 아닌 경우 Hive.initFlutter() 가 아닌 Hive.init()를 사용

2.2 OpenBox

hive에서 박스란 NoSQL의 Collection

공식 홈페이지에서의 정의

What are boxes?

All data stored in Hive is organized in boxes. A box can be compared to a table in SQL, but it does not have a structure and can contain anything.

  • box는 table과 비슷하지만 구조화되지 않았다는 차이가 있다
    • 결론 : box는 데이터를 저장하는 공간이다

2.2.1 box 생성

    await Hive.openBox('myBox');
    final box = Hive.box('myBox');
  • OpenBox 이후에는 box 메소드를 통해 해당 박스를 가져올 수 있다

3. 사용법

읽기 : get
쓰기 : put

3.1 read

    final box = Hive.box('myBox');
    
    String name = box.get('name');
    
    DateTime birthday = box.get('birthday');
  • 존재하지 않는 데이터를 읽을 때는 null을 리턴하지만 defaultValue를 사용해서 default값을 정할 수 있다.
    double height = box.get('randomKey', defaultValue: 17.5);

3.2 write

    final box = Hive.box('myBox');
    
    box.put('name', 'Paul');
    
    box.put('friends', ['A', 'B', 'C']);
    
    box.put(123, 'test');
    
    box.putAll({'key1': 'value1', 42: 'life'});

4. Custom Object 작성

기본적으로 List, Map, DateTime, Unit8List 등 주요 타입들을 지원하지만 그 외에 새로운 타입을 원하면 TypeAdapter 를 작성하여 Hive에 등록 해주어야 한다.

    import 'package:hive/hive.dart';
    
    part 'person.g.dart';
    
    @HiveType(typeId: 0)
    class Person {
      @HiveField(0)
      String name;
    
      @HiveField(1)
      int age;
    
      @HiveField(2)
      List<String> friends;
      
      Person(this.name, this.age, this.friends);
    }
  • TypeAdapter 를 만들기 위한 class 를 제작 후, 클래스 위에 @HiveType(typeId:) 를 추가
    • TypeField는 0 ~ 233
  • 클래스 안의 항목들은 @HiveField([index], [default value]) 를 추가

    Default value 기능은 hive: 2.0.4 , hive_generator: 1.1.0 이후 버전부터 사용 가능

  • part 경로 추가 이후 터미널에서 아래 build_runner 를 실행
    flutter packages pub run build_runner build
  • .g.dart 라는 새로운 TypeAdapter 생성을 확인
  • 생성된 TypeAdapter 를 적용하기 위해서는 registerAdapter 를 이용
    Hive.registerAdapter(personAdapter());
    final person = await Hive.openBox<Person>('person');
    
    person.put('david', Person('david', 20, ['Tom', 'Ben']);
    person.put('sandy', Person('sandy', 30, ['david', 'suzan', 'eric']);

5. hive 데이터 타입

5.1 Primitive data types

5.1.1 Numeric data type

  • tinyint : 1-byte
  • smallint : 2-byte
  • int : 4-byte
  • bigint : 8-byte
  • float : 4-byte single-precision
  • double : 8-byte double-precision
  • decimal : 17-byte (38 digits)
       create table test (id bigint, price decimal(10,2));

5.1.2 String data type

  • string : sequence of characters
  • varchar : variable-length character (1 ~ 65355 )
  • char : fixed-length character ( 1 ~ 255 )

5.1.3 Date/Time data type

  • Timestamp : YYYY-MM-DD HH:MM:SS.fffffffff

  • Date : YYYY-MM-DD(Date 타입은 Date, Timestamp, String으로 변환가능)

       create table test (id int, created_dt date, update_dt timestamp);

5.1.4 etc

  • Boolean : true or false
  • Binary : sequence of bytes

5.2 Complex data tyeps

5.2.1 Struct : similar c struct type.

       struct < column : data_type(primitive type), .........>

       struct_coumn.column로 참조        

       create table test1 (id int, name struct<first:string, last:string>);

5.2.2 Map : key-value pairs

map_column->name

5.2.3 Array : ordered sequece of similar elements like string..

t[ 'a', 'b','c' ], t[0], t[1]

5.2.4 UNIONTYPE : store different data types.


       

       create table test2(c1 uniontype<int, double, array<string>, struct<age:int, country:string>>);

5.3 operators

5.3.1 비교 연산

  • A = B
  • A != B
  • A <=> B : A and B NUL 이면 true
  • A <> B
  • A< B : A or B가 NULL이면 NULL, A < B이면 TRUE
  • A <= B
  • A >= B
  • A between B and C : A or B or C 가 NULL 이면 NULL
  • A not between B and C
  • A is null
  • A is not null
  • A like B : A or B가 NULL이면 NULL
  • A not like B
  • A RLIKE B : A or B가 NULL이면 NULL, A의 substring이 B에 매칭되면 true
  • A regexp B

5.3.2 산술 연산

  • A or B중 NULL이면 결과 NULL이고 모든 연산의 결과는 숫자

  • A + B , A-B, A*B...

hive> select 10+10 from test;

5.3.3 논리 연산

  • 연산자는 AND, OR이며 모든 결과는 TRUE, FALSE이며, operand중 NULL이면 결과도 NULL
      A and B, A && B, A OR B, ! A , A IN (v1, v2..), A in (subquery)

      A not in (v1, v2..), A not in (subquery), exists (subquery), 

      not exists (subquery)

5.3.4 복잡 연산

      A[i], B[key], C.a

      select A[2] from test;

      select C.a from test;

참고

0개의 댓글