курсор падает с CursorIndexOutOfBoundsException - PullRequest
1 голос
/ 26 апреля 2019

Мой курсор вызывает сбой моего приложения с ошибкой базы данных Android.

CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

Я сделал еще один гораздо менее оптимизированный слайдер, который сканирует мою базу данных, и я нашел хорошее значение.

public Cursor getAllDataTableStaffDatabase(String table_name){
     this.open();
     Cursor result =this.mDb.rawQuery("SELECT * FROM " + table_name,null);
     return result;// fonctionne très bien
}

public String findNameOfStaffBymail(String mail) {
    String sql = " SELECT  *  FROM " + DatabaseStaffHandler.STAFF_TABLE_NAME + " WHERE " + DatabaseStaffHandler.STAFF_MAIL + " = ? ";
    Cursor result = super.mDb.rawQuery(sql, new String[]{mail});
    Cursor data = super.getAllDataTableStaffDatabase(DatabaseStaffHandler.STAFF_TABLE_NAME);

    String test = result.getString(1); //error

    while (data.moveToNext()) {
        if (data.getString(3).equals(mail)) {
            viewAll();
            return data.getString(1);
        }
    }
}

Я хотел бы получить имя значения, которое соответствует адресу электронной почты.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Спасибо за ваш ответ.Я нашел мою проблему благодаря тебе.Интересно, курсор не загружается в конце.Но это хорошая практика, чтобы проверить, если получено не является нулевым.Спасибо и хорошего дня

0 голосов
/ 26 апреля 2019

Обычно это происходит, когда у вас нет данных в вашем Cursor, и вы все еще пытаетесь получить доступ к данным.Это похоже на ArrayIndexOutOfBoundsException.До сих пор я не нашел ничего плохого в вашем запросе.Тем не менее, я думаю, что вы могли бы рассмотреть возможность добавления проверки null в ваш код, которая предотвратит сбой вашего приложения.Особенно в цикле while необходимо поставить проверку null в условии.

И вам нужно использовать функцию moveToFirst везде, где это необходимо.

public Cursor getAllDataTableStaffDatabase(String table_name) {
     this.open();
     Cursor result = this.mDb.rawQuery("SELECT * FROM " + table_name,null);
     return result;
}

public String findNameOfStaffBymail(String mail) {
    String sql = " SELECT  *  FROM " + DatabaseStaffHandler.STAFF_TABLE_NAME + " WHERE " + DatabaseStaffHandler.STAFF_MAIL + " = ? ";
    Cursor result = super.mDb.rawQuery(sql, new String[]{mail});
    Cursor data = super.getAllDataTableStaffDatabase(DatabaseStaffHandler.STAFF_TABLE_NAME);

    // Add a null checking here.
    if (result != null) {
        result.moveToFirst();
        String test = result.getString(1);
    }

    if(data != null) data.moveToFirst();

    while (data != null) {
        if (data.getString(3).equals(mail)) {
            viewAll();
            return data.getString(1);
        }

        data.moveToNext();
    }
}

Надеюсь, что это решит вашу проблему.

...