簡體   English   中英

為什么 Room 在遷移后刪除我的數據庫

[英]Why Room remove my database after migration

我想在數據庫中創建新表。 遷移應用程序刪除數據庫中的所有項目后。 為什么? 我沒有使用fallbackToDestructiveMigration()

我的代碼:

public class DatabaseClient {

private static DatabaseClient mInstance;
private DatabaseApp databaseApp;

private DatabaseClient(Context context) {
    appDatabase = Room.databaseBuilder(context, DatabaseApp.class, "DB_NAME").build();
    appDatabase = Room.databaseBuilder(context, DatabaseApp.class, "DB_NAME").addMigrations(MIGRATION_1_2).build();
}

public static synchronized DatabaseClient getInstance(Context mCtx) {
    if (mInstance == null)
        mInstance = new DatabaseClient(mCtx);
    return mInstance;
}

public AppDatabase getAppDatabase() {
    return appDatabase;
}

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(@NonNull final SupportSQLiteDatabase database) {
        database.execSQL("CREATE TABLE `MarkRead` (`Id` INTEGER, `StudentId` TEXT," +
                "`StudentName` TEXT, `MarkId` INTEGER,`Mark` TEXT, PRIMARY KEY(`Id`))");
    }
};
}

我究竟做錯了什么?

這是因為您的舊數據尚未移動到新表中。

您必須執行以下步驟:

  1. 創建一個您希望最終創建的臨時表。

CREATE TABLE TEMP (... put your columns here)

  1. 通過編寫“SELECT *”查詢從現有表中獲取結果。

  2. 將上一個查詢的結果插入到 Temp 表中。

INSERT INTO TEMP SELECT .... FROM ORIGINAL

  1. 刪除現有的表。

DROP TABLE ORIGINAL

  1. 使用現有表的名稱重命名臨時表。

ALTER TABLE TEMP RENAME TO ORIGINAL

現在您將擁有一個具有相同名稱和數據的新表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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