移行を適切に処理していないため、アプリがクラッシュします。 テーブルの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");
}
};
_
移行なしの解決策があります-使用 ColumnInfo :
data class Content(@PrimaryKey var id: String, @ColumnInfo(name = "archiveCount") var dismissCount: Double) : Parcelable{...}
データベース列は引き続きarchiveCount
ですが、Kotlinではプロパティの名前が変更されます。