簡體   English   中英

java.lang.IllegalStateException:遷移未正確處理:BriefComposition

[英]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_2Composition.MIGRATION_1_2 Composition 的遷移覆蓋了 BriefComposition 的遷移,因此不調用BriefComposition.MIGRATION_1_2並且不添加列isNeedVip

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM