개발일지

Android in A..Z - Room (Migration) 본문

Android (안드로이드)/Room

Android in A..Z - Room (Migration)

강태종 2021. 1. 17. 02:42

Migration

Room에서 Scheme가 업데이트 된 경우 처리를 해줘야 하는데 이를 Migration이라고 한다.

Scheme에 변화가 생기면 직접 SQL문을 작성해서 처리해야 하고 데이터베이스의 버전을 수정해야 미리 다운로드된 기기에서 앱 업데이트시 정상 작동할 수 있다.

 

ToDo


AppDatabase

Migration을 상속받아 migrate를 override한 후 addMigrations로 Migrate한다.

@Database(entities = [Drawer::class, ToDo::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase() {
    companion object {
        private var instance: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {
            return instance ?: synchronized(this) {
                Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
                    .addCallback(object : Callback() {
                        override fun onCreate(db: SupportSQLiteDatabase) {
                            super.onCreate(db)
                            CoroutineScope(Dispatchers.IO).launch {
                                getInstance(context).drawer().insert(
                                    Drawer(name = "ToDo")
                                )
                            }
                        }
                    })
                    .addMigrations(MIGRATION_1_2)
                    .build()
            }.also {
                instance = it
            }
        }

        private val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE ToDo ADD COLUMN isFinished INTEGER DEFAULT 0 NOT NULL")
            }
        }
    }

    abstract fun drawer(): DrawerDao
    abstract fun todo(): ToDoDao
}
  • Migration 생성자 : startVersion, endVersion

Git (예제코드)

github.com/KangTaeJong98/Example/tree/main/Android/Room

 

KangTaeJong98/Example

My Example Code. Contribute to KangTaeJong98/Example development by creating an account on GitHub.

github.com

 

Comments