Android Room: как перенести переименование столбца? - PullRequest
0 голосов
/ 05 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Решение

Благодаря руководству @TimBiegeleisen мы обнаружили, что реализация SQLite для Android 3,19 для API 27 и 28 еще не обновлен до версии 3.25 SQLite, которая позволяет использовать эту функцию, описанную в этом StackOverflow сообщении .

Как только Android обновит такую ​​команду, чтобы изменить столбец таблицы: database.execSQL("ALTER TABLE content RENAME COLUMN archiveCount TO dismissCount")

0 голосов
/ 05 октября 2018

Существует решение без миграции - используйте ColumnInfo :

data class Content(@PrimaryKey var id: String,  @ColumnInfo(name = "archiveCount") var dismissCount: Double) : Parcelable{...}

Столбец базы данных будет по-прежнему archiveCount, но в свойстве Kotlin будет переименован.

...