2014-06-05 3 views
7

Ich schreibe eine Android-App mit SQLite DB.Datenbank kann nicht von Version 2 auf 1 heruntergestuft werden, selbst nach einer Neuinstallation und -wiederherstellung

Ich hatte einige Experimente und verändert die DB-Version von 1 bis 2

Dann stabil mein DB-Schema wurde und weil ich die App nicht freigegeben hat, und es ist für meinen eigenen Gebrauch

Ich habe beschlossen, um die Version wieder auf 1 zu ändern.

Ich habe neu installiert und alles hat gut funktioniert.

Aber dann zum zweiten Mal in Folge führt diesen Fehler:

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) 

Warum ist, dass nach allem, was ich frisch nicht installiert habe und die DB ebenfalls entfernt werden soll. Nein?

Wie kann ich die Version wieder auf 1 ändern?

+0

Es sieht so aus, als ob Sie eine Datenbank mit Version 1 beim Start erstellen und sie während des Betriebs aktualisieren. Danach führen Sie Ihre App erneut aus und müssen downgraden. Postleitzahl, in der Sie Ihre Datenbank erstellen. –

+0

http://stackoverflow.com/questions/15018025/cant-downgrade-database-from-version-2-to-1 – user

Antwort

11

Diese Ausnahme von den folgenden Bedingungen ausgelöst:

  • Das Gerät, das Sie auf den Code ausführen verfügt über eine Datenbank-Datei der Version 2.
  • Der Code der Version 1 der Datenbank anfordert (mit einem Parameter SQLiteOpenHelper Konstruktor)
  • onDowngrade() wird in Ihrem Code nicht überschrieben.

Sie sagen, der Code funktionierte gut das erste Mal nach einer Neuinstallation. Stellen Sie sicher, dass kein anderer Code die Versionsnummer derselben Datenbankdatei erneut auf 2 erhöht.

+1

Was sind die möglichen Gründe für das Downgrade der Version? –

+0

Was für eine Frage Muhammad Babar ...! Nun, jemand möchte einige widersprüchliche Spalten aus dem aktuellen Schema löschen, jemand möchte unbenutzte Spalten entfernen, jemand möchte das Schema mit ein paar neuen Spalten neu definieren und alte werden gelöscht und beschließt, das ganze Ding fallen zu lassen und dann zu aktualisieren? –

0

Sie zeigen nicht an, wo die Datenbank erstellt wird, wo normalerweise die Datenbankversion zugewiesen ist (d. H. SQLiteOpenHelper ctor).

Gibt es eine Chance, dass Sie die Datenbank auf einem externen Dateisystem haben? Wenn Sie den Namenskonventionen nicht folgen, werden diese Dateien beim Entfernen der Anwendung nicht gelöscht.

0

Wie haben Sie die Neuinstallation durchgeführt?

  • adb install -r? In diesem Fall werden die Daten Ihrer App, einschließlich der Datenbank (en), nicht berührt.
  • adb uninstall und adb install? Dies wäre der richtige Weg, um eine Neuinstallation durchzuführen. Alle Daten werden während der uninstall entfernt und Ihre Datenbank wird nach dem ersten Start nach dem install neu erstellt.

Aber Sie schreiben, dass beim ersten Start nach der Neuinstallation es funktionierte. Das kann nur bedeuten, dass Sie irgendwo noch ein Upgrade auf Version 2 durchführen.

0

Aktualisieren: Gehen Sie zu App-Info und> Speicher und löschen Daten sollten auch funktionieren.

Ein möglicher Grund, dass es zum ersten Mal, aber nicht zum zweiten Mal funktionierte, könnte sein, dass die Datenbank nicht im ersten Durchlauf aufgerufen wurde?

Auch aus Marshmallow, Android-App-Daten ist automatically backed up. für Apps Targeting 23+ so Ihre App könnte die vorherige Datenbank aus der Cloud bekommen, ohne dass Sie es wissen.

Leider können Sie App-Daten noch nicht einzeln löschen. Aber wenn es Ihnen nichts ausmacht, Ihre gesicherten Daten für alle Apps zu löschen, können Sie die App deinstallieren und dann unter https://myaccount.google.com/dashboard den Abschnitt Android erweitern und gesicherte App-Daten löschen.

Danach sollten Sie in der Lage sein, die App neu zu installieren und eine neue Datenbank zu erhalten.

Dies funktionierte für mich, aber auf eigene Gefahr.

1

Sie können die onDowngrade() selbst überschreiben, wenn Sie Ihre Anwendung mit einer Datenbank auf dem Gerät mit einer höheren Version ausführen möchten, als Ihr Code verarbeiten kann.

Dies ist die Standardimplementierung von onDowngrage():

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

Wenn Sie diese Methode außer Kraft setzen müssen Sie this question also lesen.

Ohne diese Methode zu überschreiben, können wir die SQLite-Version nicht verringern, nachdem sie erhöht und ausgeführt wurde. Sie müssen also zurück zu 2 oder mehr ändern, als 2:

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

Wenn Sie versuchen, Ihre Tabelle zu aktualisieren, müssen wahrscheinlich 3 nicht 2 und jedes Mal Sie Tabelle aktualisieren, müssen passieren, Sie muss die Version erhöhen (nicht verringern).

0

Dies bedeutet, dass bereits eine vorherige Datei vorhanden ist und Sie versuchen, eine andere mit demselben Namen zu erstellen. Sie können den Namen der Datenbank ändern oder auf dem Gerät, das emuliert wird, die Anwendung deinstallieren und erneut emulieren .

Verwandte Themen