2013-03-06 8 views
6

Następujące oświadczenie cursor.moveToNext() jest zawsze fałszywe. Oczekuję, że pętla zostanie wykonana raz. Przetestowałem, że zapytanie faktycznie zwraca dane.Android: SQLite, cursor.moveToNext() zawsze zwraca fałsz

Czy ktoś wie, co się dzieje?

String query ="SELECT(SELECT COUNT(*) FROM Table1) as count1, (SELECT COUNT(*) FROM Table2) as count2;"; 

    Cursor mCursor = mDb.rawQuery(query, null); 

    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 

    while (cursor.moveToNext()) { //<---------------return false here??? 
     String result_0=cursor.getString(0); 
    } 
+0

Czy jest to związane bez użycia "FROM" w zapytaniu, aby SQLite nie mógł go zidentyfikować jako vaild? –

+0

nop ... twoje zapytanie powinno zwrócić tylko jeden wiersz, więc gdy użyjesz cursor.moveToFirst() jesteś w pierwszym wierszu ... teraz każde wywołanie moveToNext() zwróci fałsz ... mCursor nigdy nie powinien być pusty, więc używaj czegoś jak 'if (mCursor.moveToFirst()) {do {/ * String res ... twoje rzeczy * /} podczas (mCursor.moveToNext());} else {/ * kursor nie ma wierszy, nie powinno się wydarzyć * /}' lub w tym przypadku (ponieważ powinien zwrócić tylko jeden wiersz 'if (mCursor.moveToFirst()) {/ * String res ... twoje rzeczy * /} else {/ * kursor nie ma wierszy WTF? * /}' – Selvin

+0

kocham kochanie, problem rozwiązany !!! Po usunięciu cursor.moveToFirst() ...... haha ​​ –

Odpowiedz

3

wiem, że rozwiązał problem, ale o to, co stało się solucja:

Cursor mCursor = mDb.rawQuery(query, null); 

// At this point mCursor is positioned at just before the first record. 

if (mCursor != null) { 
    mCursor.moveToFirst(); 
    // mCursor is now pointing at the first (and only) record 
} 

while (mCursor.moveToNext()) { 
    String result_0=cursor.getString(0); 
} 

// The loop above was skipped because `.moveToNext()` caused mCursor 
// to move past the last record. 

Więc w razie potrzeby tylko jednego rekordu, tylko trzeba albo mCursor.moveToFirst()LUB swój mCursor.moveToNext().

1

możesz iterować kursor w ten sposób.

+0

Przeczytałem, że 'getCount()' jest kosztowną operacją, więc prawdopodobnie lepiej jest go unikać, jeśli możesz (patrz http://stackoverflow.com/a/16186513/1084488). – Matthias

+1

Nigdy nie komentuj powyższego komentarza, po przejrzeniu kodu źródłowego Androida odkryłem, że prawie wszystkie operacje kursora (w tym 'moveToFirst()', 'moveToNext() ',' isBeforeFirst() ' a 'isFirst()') spowoduje co najmniej jedno wywołanie funkcji 'getCount()'. Więc nawet jeśli 'getCount()' jest kosztowne, jest nieuniknione. Ponadto, stwierdziłem również, że implementacja 'getCount()' buforuje zwróconą wartość, więc co najmniej kolejne wywołania będą tanie. – Matthias

Powiązane problemy