138 votes

La salle ne peut pas vérifier l'intégrité des données

J'obtiens cette erreur lors de l'exécution du programme avec la base de données 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.

Il semble que nous devions mettre à jour la version de la base de données, mais d'où pouvons-nous le faire dans Room ?

3 votes

Si vous ne vous préoccupez pas des données de l'application, la suppression de tout le contenu dans les paramètres de l'application peut également être utile, car elle détruit simplement la base de données entière.

187voto

methodsignature Points 523

Lorsque vous rencontrez ce message pour la première fois, vous travaillez très probablement avec une version non publiée de la base de données. Si c'est le cas, il est probable que vous ne devez pas incrémenter la version de la base de données . Le simple fait d'effacer les données de l'application vous fera passer l'exception.

Si vous n'incrémentez pas la base de données (recommandé) :

Vous devez effacer les données de l'application dans les paramètres d'Android. Vous pouvez également désinstaller la version précédente de l'application, puis installer la nouvelle version pour contourner l'exception. Cette dernière approche ne fonctionne pas dans certaines conditions (par exemple, lorsque l'option "Autoriser la sauvegarde" est activée).

Comme l'effacement des données de l'application fonctionne toujours, je prends cette voie à chaque fois.

Si vous incrémentez la version de la base de données :

Vous devrez écrire un code de migration de la base de données pour tenir compte des modifications apportées au schéma de la base de données. Voir aquí pour des informations sur la migration.

L'alternative à l'écriture du code de migration de la base de données est d'appeler fallbackToDestructiveMigration sur le constructeur de la base de données Room. Ce n'est probablement pas une bonne idée. Oublier de supprimer cet appel et oublier ensuite de mettre à jour la base de données entraînera une perte de données.

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

Là encore, il n'est pas nécessaire d'incrémenter la version de la base de données ni de procéder à une migration destructive si le schéma de la base de données précédente n'est pas actif. dans la nature .

6 votes

J'aimerais qu'ils incluent une autre méthode de repli pour ce cas :(

3 votes

En version 1.0.0-rc1 de Room la seule chose qui a fonctionné pour moi était d'incrémenter la version de la base de données.

65 votes

J'avais Android:allowBackup="true" dans mon AndroidManifest.xml qui empêchait l'effacement des données même après la désinstallation de l'application. J'ai mis cet attribut à false puis réinstallé l'application, ce qui a permis de se débarrasser du problème. Notez que true est la valeur par défaut de allowBackup, donc si vous ne l'utilisez pas du tout, il se peut que les données soient conservées.

37voto

Hitesh Sahu Points 12561

Par défaut, les manifestes Android ont android:allowBackup="true" qui permet aux applications de conserver leur base de données SQLite lors de la réinstallation.

Supposons que votre DATABASE_VERSION était initialement de 3 et vous décidez ensuite de réduire la version de la DB de 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's nothing else to do here.
//        }
//    };
}

Vous pouvez le réaliser comme suit

  • Effacer les données de l'application de Setting. Cela supprimera l'ancienne base de données (DATABASE_VERSION =3) du téléphone.
  • Désinstaller votre application
  • Réduire la version de DATABASE_VERSION à 1
  • Construire et réinstaller votre application

C'est une bonne pratique à garder DATABASE_VERSION comme constante.

2 votes

Cela n'affectera-t-il pas les utilisateurs qui mettront à jour l'application depuis le Play Store ?

2 votes

J'ai suivi le même chemin, mais ça n'a pas marché. Même si j'essaie d'installer sur un nouvel appareil à partir d'Android Studio, la même erreur s'affiche :x

0 votes

@nimi0112 Pour votre version release, vous devez autoriser la sauvegarde, mais pour votre version debug, vous pouvez la désactiver.

26voto

Ravi Points 99

Aniruddh Parihar La réponse de l'auteur m'a donné un indice et ça a marché.

Recherchez une classe où vous avez étendu RoomDatabase . Vous y trouverez la version suivante :

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

Il suffit d'augmenter la version et le problème est résolu.

22voto

Aniruddh Parihar Points 2212

C'est très simple comme le montre le log

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

Il suffit d'aller dans la classe Version de la base de données et de mettre à jour la version de la base de données en augmentant de 1 la version actuelle.

Par exemple : Trouvez l'annotation @Database dans votre projet comme ci-dessous

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

Ici version = 1, est la version de la base de données, vous devez juste l'augmenter de un, c'est tout.

1 votes

Oui, j'ai eu cette erreur, c'est pourquoi j'ai mentionné dans la question aussi que It seems we need to update database version . Mais je n'ai pas trouvé où cette version était mentionnée. En tout cas, merci pour ce conseil.

0 votes

Vous avez reformulé le message d'erreur, mais vous n'avez pas fourni d'informations supplémentaires pour dissiper la confusion de l'expéditeur initial.

0 votes

@CarlRossman : Vous devez trouver votre classe de base de données dans votre projet où vous avez utilisé l'annotation Database, sur cette classe vous trouverez la version de la base de données (valeur entière), il suffit de l'augmenter d'une unité à partir de la version actuelle.

5voto

sudesh Points 527

Ce problème se produit principalement dans le développement.

Si vous changez votre schéma, c'est-à-dire si vous renommez/ajoutez/modifiez votre classe contenant l'entité de la table, l'intégrité entre la base de données existante dans la version précédente entre en conflit avec la nouvelle version.

effacer les données de l'application ou installer la nouvelle version après avoir désinstallé la version précédente .

Maintenant, l'ancienne base de données ne sera pas en conflit avec la nouvelle.

0 votes

Après cela, c'est toujours le crash

0 votes

Quelle est l'exception ? Veuillez mettre le journal pour réduire le problème.

2 votes

Merci, tout va bien maintenant. J'ai lu sur android:allowBackup="true" et l'utiliser à bon escient

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X