提问者:小点点

Android StudioRoom数据库迁移错误-表加扰


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")
        }
 }


奇怪的是预期表的列顺序完全被打乱。我没有改变任何字段的顺序。当我看两个版本(之前和之后)的模式导出时,它在两个版本中也有相同的字段顺序,只是在最新版本的末尾有新的额外字段。
所以我做错了什么。我唯一能想到的修复它的方法是使用“回退到破坏迁移”,这是现在的一个选项,因为应用程序不是活的,但当它是不是一个选项。


共1个答案

匿名用户

奇怪的是,预期表的列顺序被完全加扰。

列的顺序无关紧要。您的问题是列类型BOOLEAN的使用以及DEFAULT值的使用。

该类型应该改为INTEGER。

  • Room仅支持以下列类型之一:-
    • 整数,实数,文本或块

    所以你想用

    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'