android-Room如何为数据迁移添加外键引用

android-Room如何为数据迁移添加外键引用,android,sql,android-room,Android,Sql,Android Room,我已更新我的一个房间实体,使其包含外键。我现在必须将此更改包括在数据迁移中。但是在SQL查询上不确定 我尝试了以下方法,但无法编译 private val MIGRATION_1_2 = object: Migration(1, 2){ override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE `Entity` ADD FOREIGN KEY(`par

我已更新我的一个房间实体,使其包含外键。我现在必须将此更改包括在数据迁移中。但是在SQL查询上不确定

我尝试了以下方法,但无法编译

private val MIGRATION_1_2 = object: Migration(1, 2){
    override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL("ALTER TABLE `Entity` ADD FOREIGN KEY(`parent_id`) REFERENCES `Entity`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE)")
     }
}

也许对你来说太晚了,但对其他看这里的人来说:

在SQLite上,更改表以添加外键是不可能的,至少根据以下内容: 仅支持ALTER TABLE命令的RENAME TABLE、ADD COLUMN和RENAME COLUMN变体。其他类型的ALTER TABLE操作,如DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT等都被省略

考虑到这一点,我认为迁移数据库的正确方法是:

  • 创建新的临时表
  • 将值从旧表复制到临时表
  • 放下旧桌子
  • 将临时表重命名为旧表名
  • 在您的情况下,这可能看起来像:

    override fun migrate(database: SupportSQLiteDatabase) {
        // Create a new translation table
        database.execSQL("CREATE TABLE IF NOT EXISTS `Entity_new` (" +
            "`old_column_1` TEXT NOT NULL, " +
            "`old_column_2` TEXT NOT NULL, " +
            "`parent_id` INTEGER, " +
            "`entity_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " +
            "FOREIGN KEY(`parent_id`) REFERENCES `Entity`(`entity_id`) ON UPDATE NO ACTION ON DELETE CASCADE )")
        // Copy the data
        database.execSQL("INSERT INTO `Entity_new` (old_column_1, old_column_2, entity_id) " +
            "SELECT old_column_1, old_column_2, entity_id " +
            "FROM Entity")
        // Remove old table
        database.execSQL("DROP TABLE Entity")
        // Change name of table to correct one
        database.execSQL("ALTER TABLE Entity_new RENAME TO Entity")
    }
    

    免责声明:我改编了这段非常有用的代码。

    您得到的错误是什么?另外,我认为您有一个多余的括号