Номер не может проверить целостность данных.

Я получаю эту ошибку во время запуска программы с помощью Database Room

Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. 
You can simply fix this by increasing the version number.

Кажется, нам нужно обновить версию базы данных, но откуда мы можем это сделать в комнате?

Ответ 1

Когда вы впервые столкнетесь с этим сообщением, вы, скорее всего, будете работать с неизданной версией базы данных. Если это так, скорее всего, вам не следует увеличивать версию базы данных. Простая очистка данных приложения приведет к тому, что вы передали исключение.

Если вы не увеличиваете базу данных (рекомендуется):

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

Поскольку очистка данных приложения всегда работает, я выбираю этот путь каждый раз.

Если вы увеличиваете версию базы данных:

Вам нужно будет написать код переноса базы данных, чтобы учесть любые изменения в схеме базы данных. Смотрите здесь для получения информации о миграции.

Альтернативой написанию кода миграции базы данных является вызов fallbackToDestructiveMigration в построителе базы данных Room. Это, вероятно, не очень хорошая идея. Если вы забудете удалить этот вызов, а затем забудете обновить базу данных, это приведет к потере данных.

// Using this fallback is almost certainly a bad idea
Database database = Room.databaseBuilder(context, Database.class, DATABASE_NAME)
        .fallbackToDestructiveMigration()
        .build();

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

Ответ 2

По умолчанию у манифеста Android есть android:allowBackup="true", которые позволяют приложениям сохранять свою базу данных SQLite при переустановке.

Предположим, что у вас DATABASE_VERSION изначально было 3, а затем вы решили уменьшить версию БД с 3 до 1.

@Database(entities = {CallRecording.class}, version = DATABASE_VERSION)
public abstract class AppDatabase extends RoomDatabase {
    public abstract RecordingDAO recordingDAO();

//    static final Migration MIGRATION_1_2 = new Migration(1, 2) {
//        @Override
//        public void migrate(SupportSQLiteDatabase database) {
//            // Since we didn't alter the table, there nothing else to do here.
//        }
//    };
}

Вы можете достичь этого, как это

  • Очистить данные приложения из настроек. Это удалит старую БД (DATABASE_VERSION = 3) с телефона
  • Удалить приложение
  • Уменьшить версию DATABASE_VERSION до 1
  • Создайте и переустановите ваше приложение

DATABASE_VERSION сохранять DATABASE_VERSION постоянным.

Ответ 3

Это очень просто, как показано в log

Looks like you've changed schema but forgot to update the version number. 
You can simply fix this by increasing the version number.

Простой переход к классу базы данных и обновление версии БД путем увеличения 1 от текущего.

Ответ 4

Анирудд Парихар дал мне подсказку и решил.

Найдите класс, в котором вы расширили RoomDatabase. Там вы найдете версию, как показано ниже:

@Database(entities = {YourEntity.class}, version = 1)

просто увеличить версию и решить проблему.

Ответ 5

android: allowBackup = "true" внутри AndroidManifest.xml предотвращает очистку данных даже после удаления приложения.

Добавьте это в свой манифест:

android:allowBackup="false"

и переустановите приложение.

Примечание. Убедитесь, что позже вы вернете его к значению true, если хотите автоматически создавать резервные копии.

Другое решение:

Проверьте identityHash вашего старого файла json и нового файла json в папке apps\schema.

Если identityHash отличается, он выдаст эту ошибку. Узнайте, что вы изменили, сравнив оба файла json, если вы не хотите ничего менять.

Убедитесь, что у вас есть exportSchema = true.

@Database(entities = {MyEntity.class, ...}, version = 2, exportSchema = true)

файл схемы json:

  "formatVersion": 1,
  "database": {
    "version": 2,
    "identityHash": "53cc5ef34d2ebd33c8518d79d27ed012",
    "entities": [
      {

код:

private void checkIdentity(SupportSQLiteDatabase db) {
    String identityHash = null;
    if (hasRoomMasterTable(db)) {
        Cursor cursor = db.query(new SimpleSQLiteQuery(RoomMasterTable.READ_QUERY));
        //noinspection TryFinallyCanBeTryWithResources
        try {
            if (cursor.moveToFirst()) {
                identityHash = cursor.getString(0);
            }
        } finally {
            cursor.close();
        }
    }
    if (!mIdentityHash.equals(identityHash) && !mLegacyHash.equals(identityHash)) {
        throw new IllegalStateException("Room cannot verify the data integrity. Looks like"
                + " you've changed schema but forgot to update the version number. You can"
                + " simply fix this by increasing the version number.");
    }
}

Ответ 6

Эта проблема возникает в основном в разработке.

Если вы изменяете свою схему, т.е. Переименовываете, добавляете/модифицируете класс, содержащий табличную сущность, целостность между выходом из db в предыдущей сборке вступает в конфликт с новой сборкой.

очистите данные приложения или установите новую сборку после удаления предыдущей сборки.

Теперь старый БД не будет конфликтовать с новым.

Ответ 7

В моем случае android:allowBackup="false" превратил его из true в false, сработал, так как это также дало мне кошмары и раньше, это самая странная вещь, почему этот параметр включен по умолчанию!

Ответ 8

В моем случае у меня был класс AppDatabase.

@Database(entities = {GenreData.class, MoodData.class, SongInfo.class,
    AlbumsInfo.class, UserFolderListsData.class, UserPlaylistResponse.PlayLists.class, InternetConnectionModel.class}, version = 3, exportSchema = false)

Я обновил этот номер версии, и это решило проблему. Проблема возникла потому, что я добавил свойство в класс SongInfo и забыл обновить номер версии.

Надеюсь, это кому-нибудь поможет.

Ответ 9

Если вы обновляете версию комнаты до версии 1.0.0-alpha9 из старой версии, пожалуйста, посетите статью ниже. Очень хорошая статья для перехода от старой версии к версии 1.0.0-alpha9.

https://medium.com/@manuelvicnt/android-room-upgrading-alpha-versions-needs-a-migration-with-kotlin-or-nonnull-7a2d140f05b9

In Room New Version 1.0.0-alpha9 Room добавляет поддержку ограничения NOT NULL.

Это изменит схему, которую создает Комната. Поскольку он изменяет схему, он также изменяет идентификаторHash базы данных и используется Room для уникальной идентификации каждой версии DB. Поэтому нам нужна миграция

Ответ 10

В моем случае ContentProvider и база данных комнаты работают вместе, поэтому сначала удалите весь обратный вызов ContentProvider во всем приложении с помощью класса базы данных, который расширяет класс SqlLiteOpenHelper.

Ответ 11

В моем случае я использовал транзакцию внутри миграции, и Room не смог обновить хеш с помощью помощника по миграции

@get:Rule
val migrationTestHelper: MigrationTestHelper =

MigrationTestHelper(InstrumentationRegistry.getInstrumentation(),
                C2GDatabase::class.java.canonicalName,
                FrameworkSQLiteOpenHelperFactory()) 
/* Testing method throws error*/
db = migrationTestHelper.runMigrationsAndValidate(C2GDatabase.DB_NAME,
            3,
            false,
            C2GDatabase.Migration_1_2(),
            C2GDatabase.Migration_2_3())


override fun migrate(database: SupportSQLiteDatabase) {

/** 
    Error
    database.beginTransaction()
**/
database.execSQL("PRAGMA foreign_keys=off;")
database.execSQL("ALTER TABLE user RENAME TO user_old;")
database.execSQL("CREATE TABLE user ( id_user INTEGER PRIMARY KEY AUTOINCREMENT, external_id INTEGER NOT NULL;")
database.execSQL("INSERT INTO user ( id_user, external_id ) " +
                        " SELECT               id_user, external_id" +  
                        " FROM                 user_old;")

database.execSQL("CREATE UNIQUE INDEX idx_unique_user ON user (external_id);")
database.execSQL("PRAGMA foreign_keys=on;")
database.execSQL("DROP TABLE user_old;")
//database.endTransaction() 
}

Ответ 12

На телефоне Android:

Uninstall the app or Clear app data

Чтобы удалить данные приложения: Зайдите в настройки → Приложения → Выберите приложение → Хранилище → Очистить данные

Удаление (и повторная установка) не работает в каждом случае, поэтому попробуйте очистить данные!

Ответ 13

В моем случае я попробовал все вышеперечисленное. Казалось, ничего не работает, поэтому для меня решением было просто установить android:allowBackup="false", установите приложение, затем установите его обратно в true

Надеюсь, это поможет другим :)

Ответ 14

У меня просто была похожая проблема в тесте эспрессо, и единственное, что исправило это, - это очистка данных, а также удаление приложений Android androidx, таких как:

adb uninstall androidx.test.orchestrator
adb uninstall androidx.test.services

Ответ 15

1: - Похоже, нам нужно обновить версию базы данных (с шагом 1)

enter image description here

2-й Удалить приложение или очистить данные приложения