Android SimpleCursorAdapter wird nicht aktualisiert, wenn sich die Datenbank ändert

Ich habe eine Android ListActivity , die von einem DatenbankCursor durch einen SimpleCursorAdapter .

Wenn die Elemente angeklickt werden, wird ein Flag-Feld in der entsprechenden Zeile in der Datenbank umgeschaltet und die Ansicht in der Liste muss aktualisiert werden.

Das Problem ist, wenn die Ansicht, die aktualisiert wird, aus dem Bildschirm geht und recycelt wird, wird der alte Wert in der Ansicht angezeigt, wenn er in die Ansicht zurückkehrt. Das gleiche passiert, wenn thr Liste redrawb ist (Orientierungsänderungen usw.).

Ich benutze notifydatasetchanged() , um den Cursor-Adapter zu notifydatasetchanged() aber es scheint unwirksam zu sein.

Wie soll ich die Datenbank aktualisieren, damit der Cursor auch aktualisiert wird?

  • Externer SQLite Dateieinhalt Zugriff auf Fehler
  • Holen Sie alle Zeilen aus SQLite
  • Datenbank-Handhabung funktioniert auf Android 2.2.1 (Wunsch HD 1.72.405.3)
  • Datentypen, die in SQLite verwendet werden
  • Holen Sie sich Zeilen-ID einer SQLite FTS3-Tabelle
  • Android-Datenbank-Transaktion
  • Wie bekomme ich den Spaltenwert von sqlite cursor?
  • Sqlite Select Abfrage mit rawQuery bei Android
  • 6 Solutions collect form web for “Android SimpleCursorAdapter wird nicht aktualisiert, wenn sich die Datenbank ändert”

    Rufen Sie die requery() auf den Cursor wenn Sie Daten in der Datenbank ändern, die Sie in diesem Cursor reflektieren möchten (oder Dinge, die der Cursor ListView , wie eine ListView über einen CursorAdapter ).

    Ein Cursor ähnelt einem ODBC-Client-Side-Cursor – es enthält alle Daten, die durch das Abfrageergebnis dargestellt werden. Daher, nur weil Sie die Daten in der Datenbank ändern, wird der Cursor nicht über diese Änderungen wissen, es sei denn, Sie requery() es über requery() .


    UPDATE : Diese ganze Frage und Satz von Antworten sollte wegen des Alters gelöscht werden, aber das ist anscheinend unmöglich. Jeder, der Android-Antworten sucht, sollte bedenken, dass das Android ein schnell bewegendes Ziel ist, und Antworten von 2009 sind typischerweise schlechter als neuere Antworten.

    Die aktuelle Lösung besteht darin, einen neuen Cursor und entweder changeCursor() oder swapCursor() auf dem CursorAdapter zu verwenden, um eine CursorAdapter zu beeinflussen.

    requery ist jetzt veraltet. Aus der Dokumentation :

    Diese Methode ist veraltet. Verwenden Sie das nicht. Bitte einfach einen neuen Cursor anfordern, also kannst du das asynchron machen und deine Listenansicht aktualisieren, sobald der neue Cursor zurückkommt.

    Nach dem Erhalten eines neuen Cursors kann man den adapter.changeCursor(cursor) . Dies sollte die Ansicht aktualisieren.

    Bei Verwendung von Lader und automatisch erzeugtem Cursor können Sie anrufen:

     getLoaderManager().restartLoader(0, null, this); 

    In deiner Aktivität, nur nach dem Ändern etwas auf einer DB, um neue Cursor zu regenerieren. Vergessen Sie nicht, auch Event-Handler definiert:

     @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader cursorLoader = new CursorLoader(this, YOUR_URI, YOUR_PROJECTION, null, null, null); return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { adapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { adapter.swapCursor(null); } 

    Ich bin nicht klar, wenn Sie die autoRequery Eigenschaft von CursorAdapter auf true .

    Der Adapter überprüft die Eigenschaft autoRequery . Wenn es false , wird der Cursor nicht geändert.

    Requery () ist bereits abgelehnt, implementiere einfach die einfache updateUI () – Methode wie diese in deiner CursorAdapter-Kindklasse und rufe sie nach Datenaktualisierungen auf:

     private void updateUI(){ swapCursor(dbHelper.getCursor()); notifyDataSetChanged(); } 

    Es ist einfach.

     private Db mDbAdapter; private Cursor mCursor; private SimpleCursorAdapter mCursorAd; ..................................... //After removing the item from the DB, use this ..................................... mCursor = mDbAdapter.getAllItems(); mCursorAd.swapCursor(mCursor); 

    Oder benutze CursorLoader …

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.