java.lang.IllegalStateException:无法从CursorWindow读取行x col x。确保Cursor正确初始化。接触

时间:2013-04-26 19:50:01

标签: 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 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");
            }
        }

    }
}

如果光标“已损坏”,它永远不会重新初始化光标,因为cur.getColumCount()永远不会为0.

(我在stackoverflow上的另一个线程中读到,你应该检查列数是否为0而不是检查Cursor是否为空,但这不起作用。 这意味着,某些列/行确实只存在问题。

发生错误的部分是一个简单的

        while (cur.moveToNext())

编辑:

发生问题的部分周围的完整代码段:

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

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

请帮助我,我的评分越来越差而无法做任何事情

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

这似乎与提交给Google的错误有关:http://code.google.com/p/android/issues/detail?id=32472。它说已分配,但自去年以来我没有看到任何活动。

(根据该错误,您是否更新了支持数据库表中的任何行,这些行会在CursorWindow更新时导致行数不同?)