it-swarm.com.de

Raumversuch, eine bereits geschlossene Datenbank erneut zu öffnen

Bei der Verwendung von Room mit den Android-Architekturkomponenten wurde beim Versuch, mit einer Dagger-Komponente auf die Datenbank zuzugreifen, folgende Fehlermeldung angezeigt:

Java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: (database path)

Ich habe Dagger-Version 2.11 und Raumversion 1.0.0-alpha7 verwendet. Der Fehler war in Version 1.0.0-alpha5 reproduzierbar.

Dieser Fehler trat bei jedem Versuch auf, über ein DAO auf die Datenbank zuzugreifen, nachdem die Datenbank initialisiert und in meine Klasse eingefügt wurde.

26
huw

Dies liegt daran, dass Sie versuchen, das Schema der vorhandenen Datenbank zu ändern, ohne Migrationsinformationen anzugeben. Es wird also grundsätzlich versucht, das neue Datenbankschema in die vorhandene Datenbank zu schreiben, die nicht funktioniert.

Es gibt zwei Möglichkeiten, dies zu umgehen. Wenn Sie sich in Ihrer Entwicklungsumgebung befinden, können Sie auf eine destruktive Migration zurückgreifen. Wenn Sie dies tun, würde Ihr Code zur Datenbankerstellung in etwa wie folgt aussehen:

MyDatabase myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my-db")
    .fallbackToDestructiveMigration()
    .build();

Das heißt, wenn Sie der Datenbank eine aktualisierte oder neue Entität zur Verfügung stellen, wird sie die Antwort von @huw ausführen und die Datenbank bei der Installation der Anwendung löschen, alle Daten daraus entfernen und eine Neuinstallation durchführen.

Die andere Methode ist die Verwendung einer Migrationsfunktion. Sie sind ziemlich lang, es sei denn, jemand möchte, dass ich es hier schreibe, lasse ich es für jetzt, aber im Grunde ist die Dokumentation hier zu finden:

Raum-DB-Migrationsdokumentation

Dies führt im Wesentlichen dazu, dass die Datenbank einige von Ihnen bereitgestellte SQL-Anweisungen ausführt, um die Datenbank auf die neue Version zu aktualisieren. Auf diese Weise können Sie sicherstellen, dass während der Migration keine Daten verloren gehen. oder so wenig wie möglich, je nachdem, was Sie tun. Dies ist die bevorzugte Methode für Produktions-Apps, da die Benutzer ihre vorab vorhandenen Daten nicht verlieren und Sie keine wütenden Rezensionen oder verlorene Kunden erhalten.

Hoffe das macht hilft!

69
James Lendrem

Eine Lösung für dieses Problem bestand darin, die Datenbankdatei zu löschen und erneut zu starten. Dies war kein Problem, da ich nur testete und die Datenbank mit Online-Daten neu füllen konnte.

Dazu entweder:

  • App-Info> Speicher> Daten löschen
  • Entfernen Sie die Datei manuell unter /data/data/com.app.example/databases/database.db.
14
huw

Ich hatte diese Art von Ausnahme nach einer nicht so erfolgreichen Migration. Überprüfen Sie immer die für eine Migration verwendete SQL-Abfrage. Sie können eine neue Spalte mit einem falschen Datentyp erstellen, und die Beschreibung der Ausnahme ist nicht hilfreich.

0
lomza