#android
#Android
Вопрос:
В учебном пособии Google Notepad для 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;
}
Почему мы перемещаем курсор в first, если он не равен null? Я знаю, что это работает, но я этого не понимаю. Почему бы просто не вернуть курсор? Почему он не указывает на нужный нам объект?
Ответ №1:
При создании объекта cursor существует небольшая вероятность того, что что-то может пойти не так, и объект не был создан, а mDb.query()
метод вернул значение Null. Если это так, то попытка вызова mCursor.moveToFirst()
вызовет NullPointerException
. Если объект не равен нулю и был инициализирован правильно, то вы вызываете moveToFirst()
предположительно, чтобы поместить курсор в начало списка элементов.
Ответ №2:
Когда вы впервые получаете курсор, он в настоящее время указывает на какой-то несуществующий элемент перед первой записью. Вызывая moveToFirst, метод fetchNote подготавливает курсор к немедленному считыванию вызывающим методом. Причина, по которой мы должны сначала проверить, имеет ли курсор значение null, заключается в том, что есть вероятность, что что-то могло пойти не так с запросом, и база данных вернула значение null. Если бы мы попытались вызвать moveToFirst для курсора, мы бы получили исключение нулевого указателя.