Failure 21 & Datenbankzugriff auf geschlossenes Element

  • Antworten:2
  • Bentwortet
Mike W.
  • Forum-Beiträge: 87

24.01.2011, 21:18:54 via Website

Moin

Habe wieder einen Fehler in meiner App, auch wenn ich diesmal nicht weiss woher der kommt.
Ich habe ein Hauptmenü mit Buttons zu den Unterpunkten. Der erste Button führt zu einem TabLayout, in dem es die Tabs von Montag bis Freitag gibt.
Bei jedem Tab erstelle ich beim onCreate eine Tabelle mit dem Tag als Namen. Wenn in keiner der Tabellen etwas drin steht, wird im Hauptmenü ein Dialog erzeugt, der den User bittet dort etwas einzutragen.
Bisher hat das auch wunderbar funktioniert, aber seit heute gibt es einen Error wenn ich beim Dialog auf OK drücke (dann öffnet sich das TabLayout -> Tabelle für den aktuellen Tab wird erstellt), die App verlasse ohne etwas zu machen (Also keine Daten eingefügt in die Tabelle), sie wieder öffne und das TabLayout neu öffne.

Bis zum Beenden der App läuft es normal, keine Exceptions oder so.
Aber sobald man das zweite Mal (nach dem Beenden) auf OK drückt, kommen 2 Exceptions:
Failure 21 (out of memory) on 0x0 when preparing 'CREATE TABLE IF NOT EXISTS 'Montag' (_id INTEGER PRIMARY KEY AUTOINCREMENT, fach VARCHAR, lehrer VARCHAR, ....);'.
Failure 21 tritt laut Google dann auf, wenn das SQL-Statement falsch ist, aber bisher hat es damit immer funktioniert (und funktioniert auch bei anderen Tabellen, die im Hauptmenü erstellt werden)

Der zweite Fehler:
Caused by: java.lang.IllegalStateException: attempt to acquire a reference on a close SQLiteClosable

Das tritt bei diesem Statement auf:
cur2 = myDB.rawQuery("SELECT _id,fach,lehrer,raum,von,bis FROM '" + TABLE_NAME + "';", null);

myDB ist dabei das gleiche DB-Objekt, das ich im Mainmenu erstellt habe.
Gemäss Exception müsste myDB geschlossen sein, deshalb habe ich ausgegeben wenn die DB geöffnet (Direkt nach dem onCreate des Hauptmenüs) und wenn sie geschlossen (im onDestroy) wird.
Allerdings wird sie geöffnet, geschlossen, geöffnet und dann kommt die Fehlermeldung.

Ich hoffe ich konnte mein Problem einigermassen deutlich formulieren und jemand kann mir dabei helfen.

Schon mal danke und Gruss, Mike

Antworten
Gelöschter Account
  • Forum-Beiträge: 21

28.01.2011, 09:03:21 via Website

Hallo,

in der Android-SDK-Doku steht, dass der SQL-String nicht mit ; beendet werden darf. Vielleicht ist das die Lösung?

Gruß,
Thorsten

Antworten
Mike W.
  • Forum-Beiträge: 87

28.01.2011, 17:51:25 via Website

Danke für die Antwort, aber ich hab in allen SQL-Statements ein ; am Schluss (wusste auch nicht dass man das nicht darf) und es funktionierte prima.
Habe mir vorhin den Ablauf nochmal mit Logs ausgegeben (z.B. Ausgabe "DB ist null" wenn myDB == null war) und hab gemerkt dass es beim öffnen der zweiten Activity null war. Hab dann gesehen, dass ich in dieser Activity das DB-Objekt als static drin hatte, was dazu führte dass es nicht ging ;)
Problem ist also gelöst :D

Antworten