2012-11-29 134 views
3

我總是使用下面代碼即可獲得所有的信息
但我有疑問,c.movetoNext導致跳過結果集的第一行
請告訴我到底發生了什麼表面背後,這樣我可以完全理解爲什麼c.moveToFirst()不會跳過第一行

SQLiteDatabase db; 
    Cursor c = db.query("pic", null, null, null, null,null, null); 
    c.moveToFirst(); 
    while(c.movetoNext) 
    { 
    //do something 
    //example: String a=c.getString(0); 
    } 

回答

11

你打電話moveToFirst(),這將光標定位在第一行,然後你的while循環在進入循環之前調用moveToNext(),這會導致第一行被跳過。

你可以解決它無論是做... while循環或for循環如

for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
    // Stuff 
} 
+0

在完成遊標後,不要忘記'c.close()'。 – Flow

0
c.moveToFirst(); 

此行將光標移動到第一行。

while(c.movetoNext) 

運行此行代碼後,光標會因此移動到下一行(第2行while循環的第一輪。)的代碼進入循環時,光標指向行2已經並且永遠不能訪問第一行。

嘗試更換這樣

do { 
    // do something 
} while(c.movetoNext()) 
0

其實while循環,你不必調用c.moveToFirst();在所有

+0

爲什麼會這樣?你有沒有對該陳述的任何參考? – Flow

+0

因爲初始索引是'-1',所以'moveToNext()'就意味着索引0,參見http://androidxref.com/7.0.0_r1/xref/frameworks/base/core/java/android/database/AbstractCursor的.java#257。 –

0

一個遲到的答案,但希望其他人找到這個頁面有用。我一直在使用:「if()do {} while();」循環。如果遊標中沒有返回行,則「moveToFirst()」函數返回false。當moveToNext()函數在光標末端時返回false:

Cursor c = db.query(......); 

if (c.moveToFirst()) do { 
    data = c.getString(0) // eg. get value from first column in cursor 
    // do something more 
} while (c.moveToNext()); 

c.close(); 

(與TactMayers的答案類似)。