Почему Room удаляет мою базу данных после миграции - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу создать новую таблицу в базе данных. После миграции приложение удалило все элементы в базе данных. Почему? Я не использовал 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 Ответ

0 голосов
/ 04 февраля 2020

Это потому, что ваши старые данные не были перемещены в новую таблицу.

Вам нужно будет выполнить следующие шаги:

  1. Создать временную таблицу, которую вы хотите со временем СОЗДАТЬ.

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

Получите результаты из существующей таблицы, написав запрос "SELECT *".

Вставьте результаты предыдущего запроса в таблицу Temp.

INSERT INTO TEMP SELECT .... FROM ORIGINAL

Оставьте свой существующий стол.

DROP TABLE ORIGINAL

Переименуйте вашу временную таблицу с именем существующей таблицы.

ALTER TABLE TEMP RENAME TO ORIGINAL

Теперь у вас будет новая таблица с тем же именем и данными.

...