#android #sql #null #indexoutofboundsexception
#Android #sql #null #исключение indexoutofboundsexception
Вопрос:
В моем sql.query бывают случаи, когда курсор должен возвращать нулевое значение. Например, в приведенном ниже коде курсор ищет имя пользователя. Если у пользователя есть имя пользователя, то курсор вернет его. Если нет, то я предполагаю, что это значение равно нулю. Моя проблема в том, что когда курсор находит нулевое значение, я получаю сбой с ошибкой «вне границ». В основном означает, что курсор ничего не нашел.
public static String getUserName() {
int rowIncrement = 1;
Log.d(DATABASE, "Getting Username");
String[] usercolumns = new String[] { KEY_ROWID, KEY_NAME, KEY_PASSWORD };
Cursor c = myDatabase.query(USER_TABLE, usercolumns, KEY_ROWID "="
rowIncrement, null, null, null, null);
if (c != null) {
c.moveToFirst();
String lUserName = c.getString(1);
Log.d("DATABASE", "Username = " lUserName);
return lUserName;
}
return null;
}
Что не так с этим кодом, который может вызвать сбой, если курсор ничего не найдет?
Комментарии:
1. пожалуйста, опубликуйте вывод logcat
Ответ №1:
Кажется, из-за c.moveToFirst()
возвращает логическое значение. Поэтому вам следует изменить свой код следующим образом.
if (c != null amp;amp; c.moveToFirst()) {
String lUserName = c.getString(1);
Log.d("DATABASE", "Username = " lUserName);
return lUserName;
}
Вы можете проверить это здесь http://developer.android.com/reference/android/database/Cursor.html
Комментарии:
1. все еще не совсем верно. Сейчас я получаю исключение с нулевым указателем. В этом случае в таблице намеренно отсутствует имя пользователя. Пользователь должен быть перенаправлен на страницу создания учетной записи на основе этого факта, но поскольку возвращаемое значение равно «null», приложение завершает работу с ошибкой.
2. На самом деле, подождите, условие строки было неверным на стороне возврата. У меня было if{fUsername.isempty вместо if{fUsername == null