Курсор Android SQL равен нулю

#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