在Google的Android记事本教程(http://developer.android.com/resources/tutorials/notepad/notepad-ex1.html)中,他们对“fetchNote”有以下内容
/**
* Return a Cursor positioned at the note that matches the given rowId
*
* @param rowId id of note to retrieve
* @return Cursor positioned to matching note, if found
* @throws SQLException if note could not be found/retrieved
*/
public Cursor fetchNote(long rowId) throws SQLException {
Cursor mCursor =
mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID,
KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null,
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
如果光标不为空,为什么我们将光标移动到第一个?我知道它有效,但我不明白。为什么不直接返回光标?为什么不指向我们想要的对象?
答案 0 :(得分:1)
当您创建游标对象时,可能会出现错误并且未创建对象并且mDb.query()
方法返回Null的可能性很小。如果是这种情况,那么尝试拨打mCursor.moveToFirst()
会抛出NullPointerException
。如果对象不为null并且已正确初始化,那么您可能会调用moveToFirst()
将光标放在项目列表的开头。
答案 1 :(得分:0)
当您第一次获得游标时,它当前指向第一条记录之前的某种不存在的元素。通过调用moveToFirst,fetchNote方法正在准备要由调用方法立即读取的游标。我们必须首先检查游标是否为空的原因是因为查询可能出现问题并且数据库返回null。如果我们试图在游标上调用moveToFirst,我们会得到一个空指针异常。