안드로이드
(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()