我正在尝试使用此代码处理迁移:
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=[]}
预期的表是相同的,但顺序相反。通过在实体中颠倒我的顺序,不会发生任何差异。 如果可以,请帮忙。
答案 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)")
}
}