2012-04-09 4 views
0

Ich habe eine App mit einer SQLite-Datenbank.Android SQL-Datenbank bereits geschlossen Fehler

Ich habe meine eigene Datenbankklasse erstellt, die eine Instanz von SQLiteDatabase enthält. Die Klasse implementiert meine Abfragen, Öffnen, Schließen usw. (die Klasse ist KEIN Singleton).

Ich habe eine Aktivität, einen Dienst und ein Appwidget in meiner App.

Wo ich die Datenbank brauche, erstelle ich ein Objekt meiner Klasse, öffne, mache Sachen und schließe am Ende.

zum Beispiel in der Aktivität Ich öffne die db in onStart und schließe sie onStop.

Alles funktioniert gut außer im Appwidget.

Wenn ich Daten in der Appwidget OnUpdate auswählen muss, dann ist es in Ordnung.

aber wenn ich versuche, ein UPDATE von der Appwidget, bekomme ich den Fehler "Datenbank DATABASE_FLE bereits geschlossen".

Was kann es sein?

Ich habe einige Protokolle hinzugefügt, wo ich die db schließe, und keine dieser Zeilen vor diesem Fehler ausgeführt .. die db sollte in Ordnung sein.

Irgendwelche Ideen?

Danke.

Antwort

0

Das Problem war, dass ich ein SQLiteStatment-Objekt kompiliert und es für zukünftige Anwendungen gespeichert, während mein Datenbankobjekt ersetzt wurde .. so SQLiteStatement muss erneut erneut kompilieren.

ich so etwas wie dies hatte:

public void func(SQLiteDatabase db) { 
    if (mStatement == null) 
     mStatement = db.compileStatement(SQL); 

    mStatement.execute(); 

Das Problem dabei ist, dass das db Objekt im Funktionsaufruf geändert, und das erste db-Objekt, das kompilierte Anweisung bereits geschlossen war.

Die Lösung bestand darin, die if-null zu entfernen und die Anweisung für jedes db-Objekt zu kompilieren.

+0

Ich glaube es sehr wichtig, um eine Lösung für Ihr Problem zu veröffentlichen (falls niemand es vorher getan hat), weil andere Entwickler davon lernen können. – Jviaches

0

Woran ich denke, ist der Fall, in dem Android Ihre Aktivität schließen/entladen kann (dies kann passieren, wenn auf dem Gerät noch ein wenig Speicher vorhanden ist), aber in dieser Zeit ist Ihr Appwidget immer noch aktiv.

Nun, wegen Ihrer Aktivität ist geschlossen, damit Sie db geschlossen ist. Appwidget versucht, DB zu aktualisieren, aber es ist bereits geschlossen.

Überprüfen Sie dieses Szenario, aber trotzdem sollten Sie dieses Szenario berücksichtigen. :)

+0

in der Appwidget OnUpdate, ich ein neues Datenbankobjekt erstellen und öffnen Sie die Datenbank .. die SELECT funktioniert .. Ich bekomme den Fehler, wenn ich versuche zu aktualisieren (tatsächlich, wenn ich Bind auf einem SQL-Anweisung Objekt aufrufen) – Ran