2012-11-29 137 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的答案类似)。