4 Stimmen

Android Cursor - moveToNext() scheint nicht zum Ende des Cursors zu gehen

Warum geht mein Android-Cursor nicht bis zum Ende des ursprünglichen "Versprechens"?

Meine cursor.getCount() unterscheidet sich von meinem letzten cursor.getPosition() . Prüfen Sie meine while-Schleife! Das ist alles, was ich damit mache!

Anmerkungen : 1. Es geht um die Abfrage des Inhaltsanbieters der Kontakte (Android api >5) 2. Ich zeige nur den esential code an

Cursor cursor = mContext.getContentResolver().query(mUri, mProjections, null, null, null);
Logger.d(TAG, "***  cursor.getCount(): "+cursor.getCount());
while (cursor.moveToNext()) {
    Logger.d(TAG, "| position: "+cursor.getPosition());
    processMainCursor(serializer, cursor);
}
cursor.close();

processMainCursor() zeigt die Daten aus dem Cursor an und führt weitere Abfragen durch: eine für 4 Telefone, eine für 4 E-Mails und eine für 4 IM-Konten:

void processMainCursor(XmlSerializer serializer, Cursor main_cursor) {
     writeCursorData(serializer, main_cursor); //writes cursor data, column by column
     writePhoneEntities(serializer, main_cursor);
     writeEmailEntities(serializer, main_cursor);
     writeIMEntities(serializer, main_cursor);
}

In keinem meiner writeXXX Methoden zum Schließen meiner main_cursor Ich mache einfach eine neue Abfrage, drucke Daten und schließe den Cursor.

Also Statistik:

  • cursor.getCount() = 695 ( siempre )
  • Kommentierung writePhoneEntities, writeEmailEntities, writeIMEntities cursor.getCount() = last cursor.getPosition() = 695 ( so richtig! )
  • ein/zwei/alle meine writeXEntities zeigt Zufälligkeit; Beispiel: alle lassen: last cursor.getPosition() zeigt manchmal 254, 257, 253, usw. an; wenn man nur Telefon & IM lässt: 514, 510, 511, usw. ( also verschiedene RUN -> verschiedene letzte cursor.getPosition() VALUE )

So oppinions.. Woran liegt das? Liegt es am Gedächtnis?

Update : Das Verlassen einer meiner writeXEntities wird am Ende in logcat angezeigt: Entfernen von toten Inhaltsanbietern: Kontakte

Aktualisierung 2 Hinzufügen von cursor.moveToFirst(); & eine Schleife wie

do {
    //do whatever you want
} while (cursor.moveToNext()); 

hat die Arbeit nicht erledigt

Vielleicht liegt die Antwort also in diesen Logcat-Einträgen:

05-21 23:29:30.209: I/ActivityThread(7085): Removing dead content provider: contacts
05-21 23:29:30.209: I/ActivityThread(7085): Removing dead content provider: com.android.contacts

SAMPLE OF a writeXEntity ENTFERNT

LÖSUNG .. i war nicht Schließen der Cursor von writeXEntity (wahrscheinlich bleiben nach einer Weile ziemlich viele Cursor offen)

In Wirklichkeit habe ich so geschlossen

if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
     phone_cursor.close();
}

ich hätte nach dem Wenn schließen sollen

if(phone_cursor!=null && phone_cursor.getCount() > 0)
{                   
     //... stuff
}
phone_cursor.close();

Ich schätze, einen Basilion-Cursor offen zu lassen, war die Antwort?!?

11voto

Alex Lockwood Punkte 82384

Sie müssen den Cursor in die erste Zeile setzen. Versuchen Sie hinzuzufügen cur.moveToFirst() vor dem while Schleife.

Sie könnten auch die Verwendung eines do-while Schleife. Auf diese Weise wird sichergestellt, dass die erste Zeile im Cursor nicht übersprungen wird:

if (cursor.moveToFirst()) {
    do {
        //do whatever you want
    } while (cursor.moveToNext());               
}
cursor.close();

0voto

Barak Punkte 16300

Nun, sie werden nicht dieselbe Zahl sein, da getCount die Anzahl der Elemente und position die Position ist (die erste ist 0). Die Endposition sollte also immer um eins niedriger sein als die Anzahl.

Wenn es sich um etwas anderes handelt, habe ich Ihre Frage wohl nicht richtig verstanden.

0voto

Imran Rana Punkte 11739

Verwenden Sie den Cursor wie unten gezeigt:

             if(cursor.getCount() == 0)
              {                   
                 //No entry found
              }
              else  {
                  cursor.moveToFirst();
                  do {
                     //do whatever you want
                     } while (cursor.moveToNext());               
            cursor.close();

0voto

Asincrono Punkte 417

Nach dem Lesen der Antwort, die Sie bereits gefunden haben (Problem mit dem Schließen von Cursors), denke ich, dass der beste Weg, um sicherzustellen, dass Sie sie alle schließen, mit diesem Code ist:

Cursor c = null;
try {
   c = <your query>;
   if (c.moveToFirst()) { // No point in doing more if empty.
      do {
         <process this cursor row>
      } while (c.moveToNext());
   }
}
finally {
   if (c != null) c.close(); // Not sure the check needed, maybe if query was really wrong.
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X