web-dev-qa-db-ja.com

Android部屋:列の名前変更を移行する方法は?

問題

移行を適切に処理していないため、アプリがクラッシュします。 テーブルの1列の名前を移行するための解決策を探しています。

私のプロジェクトでは、 'content'という名前のルームテーブルがあり、Double属性 '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 Developer Advocateの説明を読んだ後 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");
  }
};
_
6
Adam Hurwitz

移行なしの解決策があります-使用 ColumnInfo

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

データベース列は引き続きarchiveCountですが、Kotlinではプロパティの名前が変更されます。

2
atarasenko