2011-08-21 4 views
18

Po utworzeniu standardowego SQLite kursor, mam iteracji thru wpisów za pomocą:sqlite: wygląda moveToNext działa bez moveToFirst potrzebne

while (cursor.moveToNext()) { 
} 

Wszystkie wiersze są przetwarzane poprawnie. Cała dokumentacja, którą przeczytałem stwierdza, że ​​musisz wydać moveToFirst(), aby zapewnić wskazanie pierwszego wpisu zestawu kursorów.

Czy to działa, mimo że nie powinno, i inne wydanie może nie mieć tego samego przetwarzania?

Odpowiedz

42

Nie, to działa poprawnie. Cursor s zaczynają się od indeksu wiersza -1 (przed pierwszym wierszem). Jeśli Cursor odwołuje się do wielu wierszy, to zapętlenie ich za pomocą pętli while, zgodnie z sugestią, jest preferowaną metodą. Zadzwoni pod numer moveToNext(), który przeniesie Cię do indeksu 0 (pierwszy wiersz) i odejdzie.

Jeśli twój numer Cursor odwołuje się tylko do jednego wiersza, możesz go wywołać przed odczytaniem danych przez moveToFirst(), aby upewnić się, że masz poprawny indeks. Zarówno moveToFirst(), jak i moveToNext() mają taki sam efekt, gdy Cursor jest po raz pierwszy utworzony i ma indeks -1.

+0

Dzięki! To tłumaczy, dlaczego działa ono konsekwentnie. Dziwne, że żaden z przykładów, które widziałem, nie wskazuje, że jest to sposób, w jaki można dokonać iteracji za pomocą kursora. – charlest

+4

+1, bardzo wspaniała analiza. Jest to również [udokumentowane tutaj] (http://developer.android.com/reference/android/database/Cursor.html#getPosition()). – orip

+0

", który przenosi Cię do indeksu 0 (pierwszy wiersz)" Prawidłowo przesuwa się do indeksu 1 z indeksu -1 przeskakując 0. – vitalii