ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java.lang.IllegalStateException : 마이그레이션이 제대로 처리되지 않음 : BriefComposition
    카테고리 없음 2020. 8. 14. 19:32

    질문

    sqlite를 업그레이드 할 때 다음 오류가 발생했습니다.

     java.lang.IllegalStateException: Migration didn't properly handle: BriefComposition(com.zhixin.wedeep.homepage.data.model.BriefComposition).
         Expected:
        TableInfo{name='BriefComposition', columns={cover=Column{name='cover', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, duration=Column{name='duration', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, downloadURL=Column{name='downloadURL', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}, tag=Column{name='tag', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, isNeedVip=Column{name='isNeedVip', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, title=Column{name='title', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
         Found:
        TableInfo{name='BriefComposition', columns={cover=Column{name='cover', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, duration=Column{name='duration', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, downloadURL=Column{name='downloadURL', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1, defaultValue='null'}, tag=Column{name='tag', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, title=Column{name='title', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
            at androidx.room.RoomOpenHelper.onUpgrade(RoomOpenHelper.java:103)

    이 두 TableInfo 를 비교했고 두 TableInfo 의 유일한 차이점이 새로운 것임을 확인했습니다.isNeedVip속성이 버전 2에 추가되었습니다.

    이것은 내 BriefComposition 엔티티입니다.

    @Entity
    data class BriefComposition(
            val cover: String,
            val duration: String,
            @PrimaryKey val id: String,
            val tag: String?,
            val title: String,
            val downloadURL: String,
            val isNeedVip:Boolean? //add on version 2
    ) : Serializable {
    
        companion object{
    
            val MIGRATION_1_2 = object : Migration(1, 2) {
                override fun migrate(database: SupportSQLiteDatabase) {
                    database.execSQL(
                            "ALTER TABLE 'BriefComposition' ADD COLUMN 'isNeedVip' INTEGER")
                }
            }
        }

    이 내 데이터베이스 class

    Database(entities = [Composition::class,CachedCompositions::class,BrowseRecord::class,Comment::class,BriefComposition::class],
            version = 2, exportSchema = true)
    @TypeConverters(Converters::class)
    abstract class HomePageDatabase:RoomDatabase() {
    
    
        abstract fun compositionDao(): CompositionDao
        abstract fun compositionsDao():CompositionsDao
        abstract fun commentDao():CommentDao
    
        companion object {
    
            const val DB_NAME= "homepage-db"
    
            // For Singleton instantiation
            @Volatile
            private var instance: HomePageDatabase? = null
    
            fun getInstance(context: Context): HomePageDatabase {
                return instance
                        ?: synchronized(this) {
                            instance
                                    ?: buildDatabase(context).also { instance = it }
                        }
            }
    
            // Create and pre-populate the database. See this article for more details:
            // https://medium.com/google-developers/7-pro-tips-for-room-fbadea4bfbd1#4785
            private fun buildDatabase(context: Context): HomePageDatabase {
                return Room.databaseBuilder(context, HomePageDatabase::class.java,DB_NAME )
                        .allowMainThreadQueries()
                        .addMigrations(BriefComposition.MIGRATION_1_2,Composition.MIGRATION_1_2)
                        .build()
            }
        }
    }

    왜 이런 일이 발생했는지 전혀 모르겠습니다. 필요한 모든 마이그레이션 을 Database Builder에 추가했기 때문입니다. 또한 내 코드를 디버깅 할 때 database.execSQL ( "ALTER TABLE 'BriefComposition'ADD COLUMN 'isNeedVip'INTEGER") 가 실행되지 않음을 발견했습니다.


    답변1

    RoomDatabase 에 추가 된 마이그레이션은 MigrationContainer . addMigrations ()함수에 대한 Document는 다음과 같이 설명합니다.

    사용 가능한 마이그레이션 목록에 지정된 마이그레이션을 추가합니다. 두 경우마이그레이션에는 동일한 시작-종료 버전이 있으며 후자의 마이그레이션은이전 항목을 재정의합니다.

    버전 1에서 2 로의 마이그레이션에는 두 가지가 있습니다. BriefComposition.MIGRATION_1_2Composition.MIGRATION_1_2 . Composition의 마이그레이션은 BriefComposition의 마이그레이션을 재정의하므로 BriefComposition.MIGRATION_1_2 가 호출되지 않고 isNeedVip열이 추가되지 않습니다.



    답변2

    마이그레이션 script가 다음과 같은 isNeedVip열의 기본값을 제공해야합니다.

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

    Document 자세한 내용은



     

     

     

     

    출처 : https://stackoverflow.com/questions/62912583/java-lang-illegalstateexception-migration-didnt-properly-handle-briefcomposit

    댓글

Designed by Tistory.