흔히 접하는 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 과정에서 여러가지 오류가 발생할 수 있다. 이 때는 당황하지 않고 구글링 하면서 문제를 해결하면 되니 시행착오를 많이 겪어 보면서 해결해나가면 된다!!