Я обновил один из объектов 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)")
}
}
Кроме того, я думаю, что у вас есть лишняя скобка
Вот аналогичный вопрос и ответ.
В SQLite изменение таблицы для добавления внешнего ключа невозможно, по крайней мере, в соответствии с этим документация SQLite:
Only the
RENAME TABLE
,ADD COLUMN
, andRENAME COLUMN
variants of theALTER TABLE
command are supported. Other kinds ofALTER TABLE
operations such asDROP COLUMN
,ALTER COLUMN
,ADD CONSTRAINT
, and so forth are omitted.
Имея это в виду, я думаю, что правильным способом переноса базы данных будет:
В вашем случае это, вероятно, будет выглядеть так:
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.
какую ошибку вы получаете?