Issue
У меня происходит сбой приложения, поскольку я не выполняю миграцию правильно. Я ищу решение для переноса имени 1 столбца в моей таблице.
В моем проекте у меня есть таблица комнаты с именем ' content ' с Двойной атрибут ' archivedCount '.В последней версии приложения атрибут archivedCount переименован в dismissCount , все еще как тип Double.
Модель оригинального контента
@Entity(tableName = "content")
data class Content(@PrimaryKey var id: String, var archiveCount: Double) : Parcelable {...}
Модель нового контента
@Entity(tableName = "content")
data class Content(@PrimaryKey var id: String, var dismissCount: Double) : Parcelable {...}
Попытка решения
После прочтения объяснения Адвоката разработчика Google Понимая миграцию с Room , я попытался найти решение, описанное в разделе поста Миграции со сложными изменениями схемы , что влечет за собой создание копии исходной таблицы, удаление старой таблицы, а затем переименование вновь созданной таблицы..
При следующем подходе в этой строке возникает ошибка времени выполнения: database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id, archiveCount FROM users");
, поскольку я уже очистил кэш своего приложения, так что старая таблица больше не существует.
Можно ли обновить один столбец, не создавая заново всю таблицу?
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
// Create the new table
database.execSQL(
"CREATE TABLE content_new (id TEXT, dismissCount REAL, PRIMARY KEY(id))");
// Copy the data
database.execSQL("INSERT INTO content_new (id, dismissCount) SELECT id, archiveCount FROM users");
// Remove the old table
database.execSQL("DROP TABLE content");
// Change the table name to the correct one
database.execSQL("ALTER TABLE content_new RENAME TO content");
}
};