Ява.ленг.IllegalStateException: не удалось прочитать строку x col x из CursorWindow.Убедитесь, что курсор правильно инициализирован.контакты

Я разработал приложение, которое проходит через все контакты на Android. Его уже опубликованы и в настоящее время установлены на ~800 устройств. Он работает почти на всех устройствах без каких-либо проблем, но на некоторых я получаю ошибку через BugSense, и я еще не нашел рабочего решения.

вот один из stacktraces Im получение:

java.lang.IllegalStateException: Couldn't read row 0, col 8 from CursorWindow. Make sure the Cursor is     initialized correctly before accessing data from it.
at android.os.Parcel.readException(Parcel.java:1335)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:182)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:136)
at android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:192)
at android.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:94)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:178)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:209)
at android.database.CursorWrapper.moveToNext(CursorWrapper.java:166)
at de.android.contactscleaner.ContactsActivity.deleteContacts(ContactsActivity.java:118)
at de.android.contactscleaner.ContactsActivity.run(ContactsActivity.java:61)
at java.lang.Thread.run(Thread.java:856)

в моем коде я делаю следующее, Прежде чем получить доступ к курсору, который также является частью решение:

    private void initCursor() {
    cr = getContentResolver();

    if (cr != null) {
        cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null,
                null, null);

    }
}

private void retryCursorInitialisation() {

    while (attempt < Rules.cursor_init_attempts) {
        attempt++;
        initCursor();
        // Check if cursor is initialisated correctly
        if (cur != null && cur.getColumnCount() != 0) {
            if (attempt >= Rules.cursor_init_attempts_to_report) {
                BugSenseHandler.sendEvent("Cursor init succeded after "
                        + attempt + "/" + Rules.cursor_init_attempts
                        + " retries");
            }
            break;
        } else {
            if (attempt == Rules.cursor_init_attempts) {
                BugSenseHandler
                        .sendEvent("Cursor init completly failed after "
                                + attempt + " attempts");
            }
        }

    }
}

Он никогда не повторно инициализирует курсор, если он "сломан", потому что cur.getColumCount () никогда не равен 0.

(Я читал в другом потоке в stackoverflow, что вы должны проверить, является ли количество столбцов 0 вместо проверки, является ли курсор нулевым, но это не работает. Это означает, что на самом деле существует только проблема с определенными столбцами/строками.

часть, где происходит ошибка, является простой

        while (cur.moveToNext())

Edit:

в полный сегмент кода вокруг части, где возникает проблема:

        if (cur != null && cur.getColumnCount() != 0) {
        try {
            cur.moveToFirst();
        } catch (Exception e) {
            initCursor();
        }

        while (cur.moveToNext()) ....

пожалуйста, помогите мне, я получаю все больше и больше плохих оценок, не будучи в состоянии сделать что-нибудь

2 ответов


похоже, это может быть связано с ошибкой, представленной в Google:http://code.google.com/p/android/issues/detail?id=32472 . Он говорит, что назначено, но я не вижу никакой активности на нем с прошлого года.

(в соответствии с ошибкой, вы обновляете любые строки в таблице БД, которая приведет к тому, что количество строк будет отличаться, когда CursorWindow обновляется?)


попробуйте позиционировать курсор с помощью moveToFirst и проверка его количества, чтобы убедиться, что он не пуст, прежде чем пытаться прочитать какие-либо данные из него.