Dav*_*vis 4 sql android 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(`parent_id`) REFERENCES `Entity`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE)")
}
}
Run Code Online (Sandbox Code Playgroud)
小智 9
也许对你来说太晚了,但对于看到这里的其他人来说:
在 SQLite 上,更改表以添加外键是不可能的,至少根据此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")
}
Run Code Online (Sandbox Code Playgroud)
免责声明:我改编了这个非常有用的PersistenceMigrationSample 项目中的代码。