【问题标题】:Android - Room how to add foreign key reference to data migrationAndroid - Room 如何在数据迁移中添加外键引用
【发布时间】:2019-05-30 08:57:30
【问题描述】:

我已更新我的一个 Room 实体以包含外键。我现在必须在我的数据迁移中包含此更改,但在 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)")
    }
}

【问题讨论】:

标签: android sql sqlite android-room database-migration


【解决方案1】:

在 SQLite 上,更改表以添加外键是不可能的,至少根据SQLite documentation

仅支持ALTER TABLE 命令的RENAME TABLEADD COLUMNRENAME COLUMN 变体。其他类型的ALTER TABLE 操作如DROP COLUMNALTER COLUMNADD CONSTRAINT 等被省略。

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

  1. 新建临时表,
  2. 将旧表中的值复制到临时表中,
  3. 放下旧桌子,
  4. 将临时表重命名为旧表名。

在你的情况下,这可能看起来像这样:

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

免责声明:我采用了这个非常有用的PersistenceMigrationSample project 中的代码。

【讨论】:

    猜你喜欢
    • 2015-09-22
    • 2015-03-03
    • 2021-07-27
    • 2020-01-23
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2016-02-11
    • 2020-03-13
    相关资源
    最近更新 更多