3

我总是使用下面的代码来获取所有信息
但我有疑问c.movetoNext导致跳过结果集的第一行
请告诉我表面背后到底发生了什么,以便我能完全理解它

    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);
    }
4

5 回答 5

14

您正在调用moveToFirst(),它将光标定位在第一行,然后moveToNext()在进入循环之前调用您的 while 循环,这会导致第一行被跳过。

您可以使用 do...while 循环或 for 循环来解决它,例如

for( c.moveToFirst(); !c.isAfterLast(); c.moveToNext() ) {
    // Stuff
}
于 2012-11-29T03:30:16.477 回答
2

一个迟到的答案,但希望对其他找到此页面的人有用。我一直在使用:“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 的回答)。

于 2016-06-21T18:32:20.353 回答
1

根据游标文档,“查询...返回:一个游标对象,位于第一个条目之前”。进一步看来,只有在 cursor 上调用方法时才会执行查询。希望有帮助。

于 2012-11-29T03:30:27.913 回答
0
c.moveToFirst();

此行将光标移动到第一行。

while(c.movetoNext)

运行这行代码后,光标将移动到下一行(第 2 行是 while 循环的第一次运行。)所以当代码进入循环时,光标已经指向第 2 行,并且永远无法访问第一排。

尝试像这样替换while循环

do {
    // do something
} while(c.movetoNext())
于 2012-11-29T03:32:25.163 回答
0

实际上,您不必调用c.moveToFirst(); 根本

于 2012-11-29T04:42:30.757 回答