Android Cursor.moveToNext()文档是否正确?

use*_*821 6 sqlite android

boolean android.database.Cursor.moveToNext()文档说:

http://developer.android.com/reference/android/database/Cursor.html#moveToNext%28%29

将光标移动到下一行.

如果光标已经超过结果集中的最后一个条目,则此方法将返回false.


但是,我的书说要执行以下操作从游标中提取数据:

Cursor myCursor = myDatabase.query(...);
if (myCursor.moveToFirst()) {
    do {
    int value = myCursor.getInt(VALUE_COL);
    // use value
    } while (myCursor.moveToNext());
}

谁是对的?这两者都不可能是真的.如果你看不到矛盾,想象一下myCursor从查询中返回了1行.对getInt()的第一次调用将起作用,但随后moveToNext()将返回true,因为它不是"已经"超过结果集中的最后一个条目.所以现在光标将超过最后一个条目,第二次调用getInt()会做一些未定义的事情.

我怀疑文档是错误的,应该改为:

如果光标"已经在"结果集中的最后一个条目,则此方法将返回false.

在moveToNext()方法返回false之前,光标必须已经是PAST(而不是AT)的最后一个条目吗?

没有Snark请

ori*_*rip 21

一个更简单的习语是:

Cursor cursor = db.query(...);
while (cursor.moveToNext()) {
    // use cursor
}
Run Code Online (Sandbox Code Playgroud)

这是因为初始光标位置为-1,请参阅Cursor.getPosition()文档.

您还可以使用此Google代码搜索查询在Android源代码中找到游标的用法.SQLite数据库和内容提供程序中的游标语义相同.

参考文献:这个问题.


Ale*_*dam 7

来自API的逐字:

返回:移动是否成功.


所以,这意味着:

第一行中的游标 - > moveToNext() - >第二行中的游标 - >没有第二行 - >返回false


如果您需要详细信息,请访问源代码:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.3_r1/android/database/AbstractCursor.java #AbstractCursor.moveToNext%28%29

public final boolean moveToNext() {
  return moveToPosition(mPos + 1);
}

public final boolean moveToPosition(int position) {
    // Make sure position isn't past the end of the cursor
    final int count = getCount();
    if (position >= count) {
        mPos = count;
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

  • “Already past”的意思是在调用之前,而不是在调用之后,否则我们不得不重新定义英文单词“already”。严格的含义在文档中是必不可少的,因为模棱两可的词充其量只是无用的。“返回:移动是否成功。”,没有任何意义,因为在我能看到的任何地方都没有定义成功,并且将一个移动到数据集的末尾通常被定义为成功。我建议简单地说明文档是错误的并建议对其进行修复。 (2认同)