IllegalStateException - requery an already closed cursor

  • 7 Antworten
  • Letztes Antwortdatum
M

maniac205

Ambitioniertes Mitglied
10
Hallo,
habe folgendes Problem:

Meine Activity ruft Daten aus einer Datenbank ab und zeigt diese an (ListActivity) das funktioniert auch so weit.

Durch "startActivityForResult" wird die Anwendung kurzzeitig verlassen um Daten aus einer anderen App zu erhalten.

Anschließend werden die resultDaten in die DB geschrieben. (Geht auch)

Nun soll die DB erneut ausgelesen werden und die Daten erneut angezeigt werden. Hier kommt es aber zu einer Exception.
Exception: java.lang.IllegalStateException: trying to requery an already closed cursor android.database.sqlite.SQLiteCursor@40f9e2e0

Code:
Code:
	ManagerDB dbManager;
	private Cursor dataCursor;
	private SQLiteDatabase isDatenbank;

       @Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.data_safe_main);

		// Initialisiere DB-Manager
		dbManager = new ManagerDB(this);
	}
Code:
	@Override
	protected void onResume() {
		super.onResume();

		// Datenbank öffnen
		Log.i(tag, "DB Open");
		isDatenbank = dbManager.getReadableDatabase();
	
			Log.d(tag, "lade Cursor");
			dataCursor = isDatenbank.query(TABELLE_DATA, new String[] {
					"_id", "dateiname", "DatPath" }, null,
					null, null, null, null);

		SimpleCursorAdapter dataCursorAdapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_expandable_list_item_2, dataCursor,
				new String[] { "dateiname", "DatPath" }, new int[] {
						android.R.id.text1, android.R.id.text2 });
		setListAdapter(dataCursorAdapter);
	}
Code:
        //onClick startet nun die Activity for Result -> die OnPause methode wird aufgerufen

	protected void onPause() {
		super.onPause();

		isDatenbank.close();

		if (dataCursor != null) {
			dataCursor.close();
		}
	}
Code:
	protected void onActivityResult(int rquestCode, int resultCode,
			Intent intentData) {
				isDatenbank = dbManager.getWritableDatabase();

                                //Lese result und schreibe in DB
				Log.d(tag, "Schreibe in DB");
				ContentValues values = new ContentValues();
				values.put(SPALTE_DATA_DAT_PATH, fileOut.getAbsolutePath());
				values.put(SPALTE_DATA_DATEINAME,
						fileHelper.getFileName(fileOut.getAbsolutePath()));
				isDatenbank.insert(TABELLE_DATA, null, values);

				isDatenbank = dbManager.getReadableDatabase();
                                //Lade erneut

			Log.d(tag, "lade Cursor");
			dataCursor = isDatenbank.query(TABELLE_DATA, new String[] {
					"_id", "dateiname", "DatPath" }, null,
					null, null, null, null);

		SimpleCursorAdapter dataCursorAdapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_expandable_list_item_2, dataCursor,
				new String[] { "dateiname", "DatPath" }, new int[] {
						android.R.id.text1, android.R.id.text2 });
		setListAdapter(dataCursorAdapter);
		}


Der Fehler hängt wohl damit zusammen, dass ich den Cursor beim verlassen in der OnPause()-Methode schließe und ihn anschließend wieder verwenden will.
 
Zuletzt bearbeitet:
dann hol dir den doch wieder :)
 
Madlip schrieb:
dann hol dir den doch wieder :)

Gute Antwort. Und ich dachte das ich das mache in dem ich in der onActivityResult()-Methode diesen erneut Initialisiere

Code:
SimpleCursorAdapter dataCursorAdapter = new SimpleCursorAdapter(this,
				android.R.layout.simple_expandable_list_item_2, dataCursor,
				new String[] { "dateiname", "DatPath" }, new int[] {
						android.R.id.text1, android.R.id.text2 });
		setListAdapter(dataCursorAdapter);


Der ursprüngliche Beitrag von 14:46 Uhr wurde um 14:47 Uhr ergänzt:

Oder hängt der Fehler mit dem setListAdapter zusammen?
 
Laut Fehlermeldung liegt es ja am Cursor, hast du mal versucht bei der Methode onActivityCreated dir den Cursor wieder zu beschaffen?
 
  • Danke
Reaktionen: maniac205
Nein. Ich muss leider zugeben, dass ich auch nicht so ganz verstehe wie.

1. onActivityCreated()
Wann wird diese Methode angesprungen? Verstehe nicht ganz wie ich diese Methode nutze.
Die Beschreibung in der Android-Referenz sagt irgendwas von Fragments

2. Wie kann ich mir den Cursor wieder beschaffen?
 
Richtig wäre, den Cursor in onCreate zu erstellen und dann startManagingCursor(cursor) aufzurufen. Dann übernimmt das Framework das Lifecycle-Management.

Gesendet von meinem MB525 mit Tapatalk 2
 
  • Danke
Reaktionen: maniac205
Danke. Wo würde ich denn den Cursor dann schließen? oder brauche ich das nicht?

Der ursprüngliche Beitrag von 17:34 Uhr wurde um 18:26 Uhr ergänzt:

Problem erledigt.

Hatte anscheinend soweit alles richtig gemacht. Wann auch nicht elegant.

Mein Fehler war, dass ich das erneute auslesen der Datenbank aus einem Thread heraus versucht habe. Das führte dann zu den Fehlern.

Trotzdem vielen dank für die Hilfe!
 
maniac205 schrieb:
Danke. Wo würde ich denn den Cursor dann schließen? oder brauche ich das nicht?

Das passiert automatisch (entweder in onStop oder onDestroy, bin mir grad nicht ganz sicher).

Gesendet von meinem MB525 mit Tapatalk 2
 
  • Danke
Reaktionen: maniac205
Zurück
Oben Unten