Development/Android

[Room DB] 기존 테이블에 필드 추가 마이그레이션

SeungYong.Lee 2025. 4. 17. 21:30
반응형

- 기존에 아래와 같이 메모 데이터를 저장하는 테이블이 있다.

@Entity(tableName = "save_model")
data class Memo(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    var title: String,
    var detail: String,
    val dtCreated: Long,
    var dtUpdated: Long,
    var color: String
)

- 링크 데이터를 추가하기 위해 String 타입 필드를 추가하려고 한다.

 

@Entity(tableName = "save_model")
data class Memo(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    var title: String,
    var detail: String,
    val dtCreated: Long,
    var dtUpdated: Long,
    var color: String,
    var link: String? = null
)

- 먼저 위와 같이 초기 값을 null로 하여 link 필드를 추가했다.

 

- 그리고 마이그레이션 오브젝트를 생성하는데, 여기서 기존 버전, 신규 버전의 값을 명확히 기입하는 것에 주의하자

private val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE save_model ADD COLUMN link TEXT")
    }
}

- 그리고 ADD COLUMN SQL 문 정확하게 작성해 준다.

 

- 이어서 DB Builder 함수에 옵션으로 추가해 준다.

@Singleton
@Provides
fun provideSaveDatabase(
    @ApplicationContext context: Context
): MemoDatabase =
    Room.databaseBuilder(context, MemoDatabase::class.java, "memo.db").addMigrations(
        MIGRATION_1_2
    ).build()

 

- 그리고 Database 객체 version도 신규 버전으로 업데이트해 준다.

@Database(entities = [Memo::class], version = 2)
abstract class MemoDatabase : RoomDatabase() {
    abstract fun saveDataDao(): SaveDataDao
}

 

반응형