본문 바로가기
[Flutter]

Flutter Floor Migration ( 컬럼 추가 / 필드 추가 / 데이터베이스 업데이트)

by Hevton 2022. 12. 31.
반응형

 

Flutter의 Floor는 안드로이드계의 Room과 같다.

 

 

데이터베이스를 생성하고 테이블을 생성하여 개발하다보면, 테이블의 필드를 새로 추가하거나, 없애거나, 자료형을 변경하는 상황이 생긴다

 

 

그래서 이걸 그대로 새로 적용하여 앱을 출시한다면,

기존에 이전버전의 앱을 사용하던 유저들의 앱에서 제대로 동작하지 않게 된다.

 

 

기존 앱 사용하던 유저 -> 새로운 데이터베이스 구조의 앱 설치

이런 상황이 되면, 데이터 변환 간에 문제가 생긴다.

아마 기본적으로 'column not exisit' 같은 에러가 발생할 것이다.

 

Migration 해주기 위해선 어떤 작업을 해야 하는지 이 글에서 설명한다.

 


 

1. Entity 수정

우선, 수정하려는 Entity를 마음껏 수정한다. 필드를 추가하거나 지우거나 등등

import 'package:floor/floor.dart';

@entity
class Diary {

  @primaryKey
  final int id;
  String path;
  int date;
  String? comment; // 새로 추가된 필드

  Diary(
      this.id, this.path, this.date, {this.comment}
      );

  Diary copy() {
    return Diary(this.id, this.path, this.date, comment: this.comment);
  }
}

나의 경우에는 comment 필드를 추가했다.

 

2. Database 버전 업그레이드

숫자를 1에서 2로 업데이트해준다.

// version 1을 version 2로 수정
@Database(version: 2, entities: [Diary])
abstract class AppDatabase extends FloorDatabase {
  DiaryRepository get diaryRepository;

}

 

3. 설정 업데이트

이러한 부분들을 수정했으면, 당연히 적용해주어야한다.

터미널을 열고 입력

 flutter packages pub run build_runner build

 

4. 마이그레이션 코드 작성

이제, 실행 코드를 수정한다.

  // 기존 코드
  // final database = await $FloorAppDatabase.databaseBuilder('app_database.db').build();


  final migration1to2 = Migration(1, 2, (database) async {
    await database.execute('ALTER TABLE diary ADD COLUMN comment TEXT');
  });

  final database = await $FloorAppDatabase
      .databaseBuilder('app_database.db')
      .addMigrations([migration1to2])
      .build();

주석 처리된 것이, 기존 코드이다.

 

이렇게 해주게 되면

기존의 내 앱을 이용하던 유저들이나, 새로 내 앱을 사용하게 된 유저들이나

모두 데이터 충돌이나 문제없이 정상적으로 변경된 기능을 이용할 수 있다.

 

 

끗!

반응형