簡體   English   中英

如何更改房間數據庫的主鍵?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM