Room не может проверить целостность данных, даже после удаления приложения и повторной установки - PullRequest
0 голосов
/ 23 апреля 2019

Я добавил несколько новых сущностей (таблиц) в существующую базу данных.Настроил так, что в конфигурации базы данных -

@Database(entities = {existingTable1.class, existingTable2.class, existingTable3.class, existingTable4.class,
        newTable1.class, newTable2.class
        }, version = 1, exportSchema = false)

Так как, приложение находится в стадии разработки, которую я использовал, чтобы избежать миграции.Итак, я удалил приложение с устройства и установил его через Android Studio (Выполнить).Но выдает следующую ошибку:

Комната не может проверить целостность данных.Похоже, вы изменили схему, но забыли обновить номер версии.Вы можете просто исправить это, увеличив номер версии.

В моем манифесте allowBackup имеет значение false, как показано ниже -

android:allowBackup="false"

EDITED

Я должен упомянуть одну вещь.У меня есть файл базы данных sqlite в папке активов.Я просто копирую его в соответствующую папку БД приложения при установке.Поэтому, когда необходимо добавить новую таблицу с большим количеством предварительно заполненных данных, я просто обновляю этот файл базы данных sqlite в папке ресурсов, затем настраиваю соответствующие объекты и собираю / запускаю проект.Таким образом, он работал нормально, но на этот раз он выпускает эту проблему.

Ответы [ 2 ]

0 голосов
/ 23 апреля 2019

Если вам не нужны данные для сохранения и вам нет дела до них, просто хотите сообщить Room, что вы мигрируете, вы можете использовать .fallbackToDestructiveMigration(), как это.

database = Room.databaseBuilder(context.getApplicationContext(),
                        UsersDatabase.class, "Sample.db")
                .fallbackToDestructiveMigration()
                .build();

Это сделает «удаление» за вас.

Вы можете обратиться к этой статье здесь

0 голосов
/ 23 апреля 2019

При изменении структуры базы данных Room вы должны создать способ обновления существующей базы данных. Если первая структура была версия 1, вторая должна быть версия 2. Но Room нужен способ обновить существующую базу данных до новой структуры. Вы должны создать функцию миграции.

static RoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (RoomDatabase.class) {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        RoomDatabase.class, "your_database")
                        .addMigrations(MIGRATION_1_2)
                        .build();                
            }
        }
    }
    return INSTANCE;
}

private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("CREATE TABLE IF NOT EXISTS new_table...
    }
};

если вы хотите начать только с начала без обновления текущей базы данных, вы можете удалить ее, чтобы форсировать создание базы данных.

    static RoomDatabase getDatabase(final Context context) {
    if (INSTANCE == null) {
        synchronized (RoomDatabase.class) {
            if (INSTANCE == null) {
                // do not forget to remove this line if it is not needed 
                context.getApplicationContext().deleteDatabase("your_database");
                // Create database here 
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                        RoomDatabase.class, "your_database")...
                ... 
...