private val migration2To3: Migration = object: Migration(2,3) {
override fun migrate(database: SupportSQLiteDatabase) {
Log.i("database", "migration from $startVersion to $endVersion started")
database.execSQL("ALTER TABLE 'gps' ADD COLUMN 'isTrack' BOOLEAN NOT NULL DEFAULT false")
Log.i("database", "TABLE gps altered. 1 new column added")
database.execSQL("CREATE INDEX IF NOT EXISTS `index_gps_tripId` ON `gps` (`tripId`)")
Log.i("database", "TABLE gps index on 'tripId' added")
Log.i("database", "migration from $startVersion to $endVersion ended")
}
}
奇怪的是预期表的列顺序完全被打乱。我没有改变任何字段的顺序。当我看两个版本(之前和之后)的模式导出时,它在两个版本中也有相同的字段顺序,只是在最新版本的末尾有新的额外字段。
所以我做错了什么。我唯一能想到的修复它的方法是使用“回退到破坏迁移”,这是现在的一个选项,因为应用程序不是活的,但当它是不是一个选项。
奇怪的是,预期表的列顺序被完全加扰。
列的顺序无关紧要。您的问题是列类型BOOLEAN的使用以及DEFAULT值的使用。
该类型应该改为INTEGER。
所以你想用
database.execSQL("ALTER TABLE 'gps' ADD COLUMN 'isTrack' INTEGER NOT NULL DEFAULT false")
但是,您会遇到这样的问题,即如果使用了NOT NULL约束,则在使用ADD COLUMN时必须有一个默认值。要向Room表明您正在使用DEFAULT值,则需要使用@ColumnInfo
注释的defaultValue
参数来指定false
作为值的成员变量/字段。
可以通过查看预期和发现的isTrack列来查看问题。结果显示亲和力、类型和默认值的差异。根据:-
isTrack=Column{name='isTrack', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='undefined'},
isTrack=Column{name='isTrack', type='BOOLEAN', affinity='1', notNull=true, primaryKeyPosition=0, defaultValue='false'