Android java.lang.IllegalStateException:无法';t从CursorWindow读取行x列x。确保光标已正确初始化。联系人

Android java.lang.IllegalStateException:无法';t从CursorWindow读取行x列x。确保光标已正确初始化。联系人,android,cursor,contacts,illegalstateexception,Android,Cursor,Contacts,Illegalstateexception,我开发了一个应用程序,它可以通过android上的所有联系人。它已经发布,目前安装在大约800台设备上。它在几乎所有的设备上运行都没有任何问题,但是在一些设备上,我通过BugSense发现了错误,我还没有找到一个有效的解决方案 下面是我得到的一个线索: java.lang.IllegalStateException: Couldn't read row 0, col 8 from CursorWindow. Make sure the Cursor is initialized corr

我开发了一个应用程序,它可以通过android上的所有联系人。它已经发布,目前安装在大约800台设备上。它在几乎所有的设备上运行都没有任何问题,但是在一些设备上,我通过BugSense发现了错误,我还没有找到一个有效的解决方案

下面是我得到的一个线索:

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$1.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");
            }
        }

    }
}
编辑:

出现问题的零件周围的完整代码段:

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

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

请帮帮我,我的评分越来越差,但我什么也做不了。

尝试使用
moveToFirst
定位光标,并在尝试读取任何数据之前检查其计数以确保其不为空。

这可能与提交给谷歌的错误有关:。上面写着“已分配”,但自去年以来,我没有在上面看到任何活动


(根据该错误,您是否在更新
CursorWindow
时更新backing DB表中会导致行计数不同的任何行?

ah sry,没有提及这一点。我已经在移动光标上做过了。只是将其添加到了主帖子您仍然缺少光标计数检查-光标可能是空的,因此不会
moveToNext
ahh好的,而不是cursor.getColumCount Just cursor.getCount(),就这样?如果解决方案有效,你有没有办法重现此错误并进行检查?使你的查询不返回任何内容,即通过删除所有联系人或添加一些错误条件来清空光标更新已结束,但我再次得到完全相同的错误,即使我检查计数之前是否大于零。但现在我至少发现了错误,所以应用程序不会崩溃。我搞不懂(
        if (cur != null && cur.getColumnCount() != 0) {
        try {
            cur.moveToFirst();
        } catch (Exception e) {
            initCursor();
        }

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