繁体   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