SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Android – Versuch, ein bereits geschlossenes Objekt erneut zu öffnen:SQLiteQuery mit loaderManager

Ihr Code ist aufgrund schlechter Formatierung etwas schwer zu verstehen.

Wie auch immer, die gelieferte Antwort ist eigentlich keine Lösung. Der Cursor kehrte bei onLoadFinished zurück sollte garantiert nicht geschlossen werden, also laden Sie Ihren Cursor falsch. Insbesondere, wenn Sie anrufen

adapter.getFilter().filter(s.toString());

Ich verstehe nicht wirklich, was hier vor sich geht, aber ich verstehe, dass Sie etwas anderes tun sollten. Speichern Sie einfach den Abfragefilter in einem Feld in Ihrem Fragment und führen Sie getLoaderManager().restartLoader(DRINKS_LIST_LOADER, null, this); aus . Beachten Sie, dass Sie restartLoader ausführen , und nicht initLoader , weil Sie andere Daten haben, die Sie abfragen möchten.

In Ihrem onCreateLoader verwenden, sollten Sie den Filter verwenden, den Sie als Instanzvariable für die selection gespeichert haben .

Einige Hintergrundinformationen

initLoader lädt die Daten, die beim letzten Lauf geladen wurden, falls dieser vorher gelaufen ist. Aus diesem Grund rufen Sie die Initialisierungsmethode Ihres Fragments/Ihrer Aktivität auf. Dies ist praktisch, da Sie die Ausrichtungsänderung nicht erneut abfragen müssen.

restartLoader bereinigt zuvor geladene Daten, sodass Sie einen neuen Loader erhalten mit (wahrscheinlich) anderen Daten zu arbeiten.

Wenn Sie sich immer noch nicht sicher sind, was Sie tun, sollten Sie unbedingt diesen Artikel lesen, der ein sehr guter Einführungsartikel zu Loadern mit Beispielcode ist, der dem entspricht, was Sie erreichen möchten. Lader sind anfangs ziemlich rätselhaft, aber sobald Sie den Dreh raus haben, geht es reibungslos.