2011-08-21 6 views
18

Dopo aver creato un cursore SQLite standard sto iterando attraverso le voci utilizzando:sqlite: sembra MoveToNext funziona senza bisogno moveToFirst

while (cursor.moveToNext()) { 
} 

Tutte le righe vengono elaborati correttamente. Tutta la documentazione che ho letto afferma che è necessario emettere un moveToFirst() per assicurare che si sta puntando alla prima voce del set di cursori.

È questo il lavoro, anche se non dovrebbe, e un altro la liberatoria potrebbe non avere lo stesso trattamento?

risposta

42

No, funziona correttamente. Cursor s iniziano con l'indice di riga -1 (prima della prima riga). Se il numero Cursor fa riferimento a più righe, il ciclo preferito tramite il ciclo while è il metodo preferito. Chiamerà lo moveToNext(), che ti porterà all'indice 0 (la prima riga), e passerà da lì.

Se il numero Cursor fa riferimento solo a una riga, è possibile chiamare moveToFirst() prima di leggere i dati per assicurarsi di essere su un indice valido. Entrambi moveToFirst() e moveToNext() hanno lo stesso effetto quando lo Cursor viene creato per la prima volta e si trova nell'indice -1.

+0

Grazie! Questo spiega perché ha lavorato in modo coerente. Strano che nessuno degli esempi che ho visto specifichi che questo è un modo per iterare attraverso un cursore. – charlest

+4

+1, analisi molto impressionante. Questo è anche [documentato qui] (http://developer.android.com/reference/android/database/Cursor.html#getPosition()). – orip

+0

"che si muove di indice 0 (prima riga)" correttamente muove all'indice 1 dall'indice -1 salto 0. – vitalii

Problemi correlati