누룽지맛치킨
어미새의 개발일지
누룽지맛치킨
전체 방문자
오늘
어제
  • 분류 전체보기 (86)
    • 코틀린 (8)
    • 안드로이드 (5)
      • 디자인 (2)
      • 개발 (2)
      • 도구 (1)
    • 피그마 (1)
    • 대외활동 (0)
    • 프로젝트 (0)
    • 백준 (55)
      • JAVA (55)
    • 알고리즘 (3)
    • 클라우드 (5)
    • 스터디 (2)
      • 코테 (2)
    • 자료구조 (5)
    • 컴퓨터 기술 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자료구조
  • 자바 Priority Queue
  • 코틀린 runBlocking
  • 안드로이드
  • 백준 자바
  • 클라우드 컴퓨팅
  • Room version 올리기
  • 알고리즘 조합
  • 백준 자바 누적합
  • 코틀린 인 액션
  • 코틀린
  • 클라우드
  • 백준 자바 2292번
  • 백준 자바 정렬
  • 백준 자바 다이나믹 프로그래밍
  • 안드로이드 디자인
  • 백준 자바 2559번
  • Room Migration
  • 백준 자바 벌집
  • 백준 자바 수열

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
누룽지맛치킨

어미새의 개발일지

Room Migration
안드로이드/개발

Room Migration

2023. 7. 3. 18:46

흔히 접하는 Room Error

프로젝트를 진행하다 보면 어쩔 수 없이 데이터베이스 스키마가 변경되고는 한다. 그렇게 Data class를 함께 변경하고 다시 앱을 실행하면 Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number. 라는 오류를 접하게 된다.
이는 Room 데이터베이스의 스키마가 변경되었을 때 반드시 버전을 올려주어야 하기 때문에 오류가 발생한다. 그렇다면 버전을 어떻게 올릴까??

Room Version 올리기

@Database(entities = [LocationData::class], version = 1)
abstract class AppDB: RoomDatabase() {

    abstract fun panelDao(): PanelDao


    companion object{


        private var INSTANCE: AppDB? = null
        fun getInstance(context: Context): AppDB? {
            if(INSTANCE == null){
                synchronized(AppDB::class.java){
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        AppDB::class.java,
                        "panel_database.db"
                    ).build()
                }
            }
            return INSTANCE
        }
   }
}

보통 처음에 데이터베이스가 처음 구성되었을 때 이런 코드로 구성이 된다. 물론 싱글톤 패턴을 사용하지 않는다면 아래의 getInstance 함수는 생략되어 있을 것이다.

이제 버전을 올려주기 위해 3가지를 하면 된다.

1) 위의 @Database 어노테이션의 version을 올려준다.
2) migration 함수 작성
3) build 시 migration 함수 추가

1. @Database 어노테이션의 version을 올리기

위의 그림과 같이 version을 한 단계 올려준다. 버전을 한 번에 여러개 올려주기 위해서는 한 단계씩 올리는 migration 함수를 모두 만들어주고 build시 모두 추가 하면 된다.

2. migration 함수 작성

private val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("DROP TABLE panel");
                database.execSQL(
                    "CREATE TABLE panel (" +
                            "id INTEGER NOT NULL, " +
                            "installationDate TEXT, " +
                            "latitude REAL NOT NULL, " +
                            "longitude REAL NOT NULL, " +
                            "humidity REAL , " +
                            "temperature REAL , " +
                            "flowRate REAL , " +
                            "title TEXT, " +
                            "address TEXT, " +
                            "town TEXT, " +
                            "PRIMARY KEY(id))"
                );
            }

        }

위의 코드를 보면 우선 버전을 몇에서 몇으로 올리는지를 Migration 파라미터로 작성해준다.
그리고 override한 migrate 함수 안에 바뀐 부분에 대해 SQL 문을 String 값으로 넣어주면 된다.
위의 예시는 Table 하나를 더 추가하는 예제이다.

3. migration 추가

fun getInstance(context: Context): AppDB? {
            if(INSTANCE == null){
                synchronized(AppDB::class.java){
                    INSTANCE = Room.databaseBuilder(
                        context.applicationContext,
                        AppDB::class.java,
                        "panel_database.db"
                    ).addMigrations(MIGRATION_1_2)
                        .build()
                }
            }
            return INSTANCE
        }

위의 코드와 같이 build 시 migration 함수를 추가해주면 된다.

버전을 잘못 올리거나 잘못된 스키마로 작성하는 등 migration 과정에서 여러가지 오류가 발생할 수 있다. 이 때는 당황하지 않고 구글링 하면서 문제를 해결하면 되니 시행착오를 많이 겪어 보면서 해결해나가면 된다!!

'안드로이드 > 개발' 카테고리의 다른 글

스플래시 화면  (0) 2023.01.17
    '안드로이드/개발' 카테고리의 다른 글
    • 스플래시 화면
    누룽지맛치킨
    누룽지맛치킨

    티스토리툴바