【问题标题】:Why Room remove my database after migration为什么 Room 在迁移后删除我的数据库
【发布时间】:2020-05-20 05:07:17
【问题描述】:

我想在数据库中创建新表。迁移应用程序删除数据库中的所有项目后。为什么?我没用过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`))");
    }
};
}

我做错了什么?

【问题讨论】:

    标签: java android migration android-room database-migration


    【解决方案1】:

    这是因为您的旧数据尚未移动到新表中。

    您必须执行以下步骤:

    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

    现在您将拥有一个具有相同名称和数据的新表。

    【讨论】:

    • 感谢您的帮助。我做了这样的事情。 link。问题并没有消失。迁移后数据库为空:(
    猜你喜欢
    • 2019-11-25
    • 2015-05-04
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多