web-dev-qa-db-fra.com

Impossible de rétrograder la base de données de la version 2 à 1 même après une nouvelle installation et une nouvelle exécution

J'écris une application Android en utilisant SQLite DB.

J'ai eu peu d'expériences et j'ai changé la version de la base de données de 1 à 2.

Ensuite, mon schéma de base de données est devenu stable et parce que je n'ai pas publié l'application, c'est pour mon usage personnel.

J'ai décidé de changer la version à 1 à nouveau.

J'ai fait une nouvelle installation et tout a bien fonctionné.

Mais courir pour la deuxième fois lève cette erreur:

06-05 10:03:35.683: E/AndroidRuntime(9010): Android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1
06-05 10:03:35.683: E/AndroidRuntime(9010):     at Android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.Java:361)

Pourquoi, après tout, j’ai fait une nouvelle installation et la base de données aurait également dû être supprimée. Non?

Comment puis-je changer la version à 1 à nouveau?

11
Elad Benda2

Cette exception est levée aux conditions suivantes:

  • Le périphérique sur lequel vous exécutez le code possède un fichier de base de données de la version 2.
  • Le code demande la version 1 de la base de données (avec un param à constructeur SQLiteOpenHelper)
  • onDowngrade() n'est pas remplacé dans votre code.

Vous dites que le code a bien fonctionné la première fois après une nouvelle installation. Assurez-vous qu'aucun autre code ne ferait passer à nouveau le numéro de version du même fichier de base de données à 2. 

16
laalto

Vous pouvez remplacer la onDowngrade() par vos propres moyens si vous souhaitez pouvoir exécuter votre application avec une base de données sur le périphérique avec une version supérieure à celle que votre code peut gérer.

Ceci est l'implémentation par défaut de onDowngrage():

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    throw new SQLiteException("Can't downgrade database from version " +
            oldVersion + " to " + newVersion);
}

Si vous devez remplacer cette méthode, veuillez lire cette question aussi .

Sans remplacer cette méthode, nous ne pouvons pas réduire la version de SQLite après avoir augmenté et exécuté. Donc, vous devez revenir à 2 ou supérieur à 2:

public DatabaseHelper(Context context) {
   super(context, DB_NAME, null, 2);
}

Si vous essayez de mettre à jour votre table, devez probablement transmettre 3 pas 2 et à chaque fois que vous devez mettre à jour la table, vous devez augmenter la version (ne pas diminuer) .

1
Blasanka

Cette exception se produit lorsque la base de données doit être rétrogradée, mais que votre classe dérivée SQLiteOpenHelper - n'implémente pas le rappel onDowngrade .

0
CL.

Vous n'indiquez pas où la base de données est créée, c'est-à-dire où la version de la base de données est normalement affectée (c'est-à-dire SQLiteOpenHelper ctor).

Y a-t-il une chance que vous ayez la base de données sur un système de fichiers externe? Sauf si vous respectez les conventions de dénomination, ces fichiers ne sont pas supprimés lors de la suppression de l'application.

0
guycole

Avait le même problème et je l'ai résolu comme ça.

@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.setVersion(oldVersion);
}
0
Balaji Ramavathu

Update : Accédez aux informations sur l'application et> Le stockage et la suppression des données doivent également fonctionner.

Une raison possible pour laquelle cela a fonctionné la première fois mais pas la deuxième fois pourrait être que la base de données n'a pas été appelée lors de la première utilisation?

Également à partir de Marshmallow, les données des applications Android sont automatiquement sauvegardées. pour les applications ciblant plus de 23 ans, votre application aurait pu obtenir la base de données précédente du cloud sans que vous le sachiez.

Malheureusement, vous ne pouvez pas encore supprimer les données de l'application individuellement. Mais si cela ne vous dérange pas de détruire vos données sauvegardées pour toutes les applications, vous pouvez désinstaller l'application, puis aller à https://myaccount.google.com/dashboard , développer la section Android et supprimer les données d'application sauvegardées. .

Après cela, vous devriez pouvoir réinstaller l'application et obtenir une nouvelle base de données.

Cela a fonctionné pour moi, mais faites-le à vos risques et périls.

0
Dittimon

Comment avez-vous effectué la nouvelle installation?

  • adb install -r? Dans ce cas, les données de votre application, y compris la ou les bases de données, ne seront pas touchées.
  • adb uninstall et adb install? Ce serait le bon moyen d'effectuer une installation propre. Toutes les données seront supprimées pendant la uninstall et votre base de données sera créée à nouveau après le premier démarrage suivant la install.

Mais vous écrivez que lors du premier démarrage après la nouvelle installation, cela a fonctionné. Cela peut simplement signifier que vous effectuez quelque part encore une mise à niveau vers la version 2.

0
msal

Cela signifie qu'il existe déjà un fichier précédent et que vous essayez d'en créer un autre portant le même nom. Vous pouvez modifier le nom de la base de données ou, sur le périphérique que vous émulez, désinstaller l'application, puis l'émuler.

0
H.Josue