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数据库和内容提供程序中的游标语义相同.
参考文献:这个问题.
来自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)
| 归档时间: |
|
| 查看次数: |
14460 次 |
| 最近记录: |