![](/img/trans.png)
[英]How to properly annotate object variables that are part of primary key in Room entity?
[英]How to change primary key of Room database?
更改我的主鍵需要我更新我的數據庫版本。 有什么方法可以使用 Room 中的遷移類將我的主鍵從一個字段更改為另一個字段? 如果不是,我該如何更改我的主鍵? 以下是我的Entity
的片段。
@Entity(tableName = "weather")
public class Weather {
@PrimaryKey
@NonNull
@ColumnInfo(name = "id")
private final String id;
@NonNull
@ColumnInfo(name = "city")
private final String city;
我想從id
切換到city
。
您必須創建一個新表,將舊表中的數據復制到新表中,刪除舊表,然后將新表重命名為原始名稱。
示例:將主鍵playlist_entry.id
重命名為playlist_entry.entry_id
:
private val MIGRATION_8_9 = object : Migration(8, 9) {
// rename playlist_entry.id to playlist_entry.entry_id
override fun migrate(database: SupportSQLiteDatabase) {
// create new temp table
database.execSQL("CREATE TABLE IF NOT EXISTS playlist_entry_new (entry_id INTEGER NOT NULL, playlist_id INTEGER NOT NULL, tab_id INTEGER NOT NULL, next_entry_id INTEGER, prev_entry_id INTEGER, date_added INTEGER NOT NULL, transpose INTEGER NOT NULL, PRIMARY KEY(entry_id))")
// copy data from old table to new
database.execSQL("INSERT INTO playlist_entry_new (entry_id, playlist_id, tab_id, next_entry_id, prev_entry_id, date_added, transpose) SELECT id, playlist_id, tab_id, next_entry_id, prev_entry_id, date_added, transpose FROM playlist_entry")
// delete old playlist_entry table
database.execSQL("DROP TABLE playlist_entry")
// rename new table to playlist_entry
database.execSQL("ALTER TABLE playlist_entry_new RENAME TO playlist_entry")
}
}
Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
.addMigrations(MIGRATION_1_2).build();
static final Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLiteDatabase database) {
database.execSQL("ALTER TABLE weather CHANGE id city VARCHAR(22) NOT NULL;");
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.