![](/img/trans.png)
[英]java.lang.IllegalStateException: Migration didn't properly handle table
[英]java.lang.IllegalStateException: Migration didn't properly handle: BriefComposition
當我升級我的 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
之間的唯一區別是版本 2 中添加的新屬性isNeedVip
。
這是我的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"
)
}
}
}
}
這是我的Database
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()
}
}
}
我不知道為什么會發生這種情況,因為我已將所有必要的migration
添加到 Database Builder。 更重要的是,當我調試我的代碼時,我發現database.execSQL("ALTER TABLE 'BriefComposition' ADD COLUMN 'isNeedVip' INTEGER")
沒有執行
您需要為遷移腳本提供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")
}
}
您可以參考文檔以獲取更多詳細信息
添加到RoomDatabase
的遷移存儲在MigrationContainer中。 function addMigrations()
的文檔指出:
將給定的遷移添加到可用遷移列表中。 如果兩個遷移具有相同的起始版本,則后一個遷移會覆蓋前一個遷移。
對於版本 1 到 2,您有兩個遷移: BriefComposition.MIGRATION_1_2
和Composition.MIGRATION_1_2
。 Composition 的遷移覆蓋了 BriefComposition 的遷移,因此不調用BriefComposition.MIGRATION_1_2
並且不添加列isNeedVip
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.