Ответ
Для изменения типа поля с int на String в Room, нужно выполнить несколько шагов:
- Изменить тип поля в сущности:
// Было:
@ColumnInfo(name = "age") val age: Int
// Стало:
@ColumnInfo(name = "age") val age: String
- Создать миграцию в классе базы данных:
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE your_table ADD COLUMN age_temp TEXT")
database.execSQL("UPDATE your_table SET age_temp = CAST(age AS TEXT)")
database.execSQL("ALTER TABLE your_table DROP COLUMN age")
database.execSQL("ALTER TABLE your_table RENAME COLUMN age_temp TO age")
}
}
- Добавить миграцию при создании БД:
Room.databaseBuilder(...)
.addMigrations(MIGRATION_1_2)
.build()
Важно: миграция не поддерживает прямое изменение типа колонки, поэтому используется временная колонка. Также убедитесь, что данные можно корректно преобразовать из int в String.