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")
가 실행되지 않음을 발견했습니다.