无法正确处理房间迁移

时间:2021-03-01 04:27:36

标签: android android-room

我正在尝试使用此代码处理迁移:

private val MIGRATION_1_2=object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("CREATE TABLE IF NOT EXISTS `CalendarModel`(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,`calendarDate` INTEGER NOT NULL,`isSelected` INTEGER NOT NULL)")
            }
        }

我的模型类是:

@Entity
data class CalendarModel(@PrimaryKey (autoGenerate = true) val id:Int=0,
                         @ColumnInfo(name="CalendarDate") val calendarDate:Long,
                         @ColumnInfo(name="IsSelected") val isSelected:Int
                         )

但是我在迁移后收到的错误是:

java.lang.IllegalStateException: Migration didn't properly handle: CalendarModel(com.package_name).
     Expected:
    TableInfo{name='CalendarModel', columns={CalendarDate=Column{name='CalendarDate', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, IsSelected=Column{name='IsSelected', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}}, foreignKeys=[], indices=[]}
     Found:
    TableInfo{name='CalendarModel', columns={isSelected=Column{name='isSelected', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, calendarDate=Column{name='calendarDate', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}

预期的表是相同的,但顺序相反。通过在实体中颠倒我的顺序,不会发生任何差异。 如果可以,请帮忙。

2 个答案:

答案 0 :(得分:0)

试试这个:

"CREATE TABLE IF NOT EXISTS `CalendarModel`(`id` INTEGER NOT NULL,`calendarDate` INTEGER NOT NULL,`isSelected` INTEGER NOT NULL, PRIMARY KEY(`id`))"

更新

将此添加到 build.grade(app) 中,在 defaultConfigs 内:

javaCompileOptions {
            annotationProcessorOptions {
                arguments += ["room.schemaLocation":
                                      "$projectDir/schemas".toString()]
            }
        }

app/schemas/your_package/ 里面你会找到 json 文件。 将 createSql 中的值复制到 database.execSQL

答案 1 :(得分:0)

感谢@Yeldar.N 指出我,故障是可变的,这是我犯的一个愚蠢的错误。

private val MIGRATION_1_2=object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("CREATE TABLE IF NOT EXISTS `CalendarModel`(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,`calendarDate` INTEGER NOT NULL,`isSelected` INTEGER NOT NULL)")
            }
        }

需要 CalendarDate instaed of calendarDate 和 IsSelected 而不是如下所示的 isSelected。

private val MIGRATION_1_2=object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("CREATE TABLE IF NOT EXISTS `CalendarModel`(`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,`CalendarDate` INTEGER NOT NULL,`IsSelected` INTEGER NOT NULL)")
            }
        }