안드로이드

(Android) Room schema 변경 (version 변경)

danune.dev 2022. 6. 24. 13:40

Room 사용 중 table 의 schema 가 변경되거나 하면 version을 올려주어 db 내용 이전 작업을 해줘야 합니다 

예제에서는 기존 User table에 nickname이 추가된 경우를 가정합니다 

 

1. 배경

  • 기존 테이블
CREATE TABLE USER(
	id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INT NOT NULL
)
  • 변경하고자 하는 테이블
CREATE TABLE USER(
	id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INT NOT NULL,
    nickname TEXT
)

 

2. 변경작업 

우선 Migration 객체를 만들고, migrate method을 override하여 Table을 옮겨주는 작업을 합니다

Migration 의 첫번째 인자는 기존 버전, 두번째 인자는 새로운 버전입니다

private val MIGRATION_1_2 = object: Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("""
            CREATE TABLE IF NOT EXISTS NEW_USER(
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                age INTEGER NOT NULL,
                nickname TEXT,
            )
            """.trimIndent())
        database.execSQL("""
            INSERT INTO NEW_USER(id, name, age)
            SELECT id, name, age FROM USER
            """.trimIndent())
        database.execSQL("DROP TABLE USER")
        database.execSQL("ALTER TABLE NEW_USER RENAME TO USER")
    }
}

 

그리고 Room databaseBuilder에 위 migration 객체를 넘겨줍니다 

INSTANCE = Room.databaseBuilder(context, AppDatabase::class.java, name)
    .createFromAsset(path)
    .addMigrations(MIGRATION_1_2)
    .build()