6

Androidのすべての連絡先を通過するアプリケーションを開発しました。すでに公開されており、現在約 800 台のデバイスにインストールされています。ほぼすべてのデバイスで問題なく動作していますが、一部のデバイスでは BugSense 経由でエラーが発生し、まだ有効な解決策が見つかりません。

ここに私が得ているスタックトレースの1つがあります:

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 になることはないため、カーソルが「壊れている」場合、カーソルを再初期化することはありません。

(スタックオーバーフローの別のスレッドで、カーソルがnullかどうかを確認するのではなく、列数が0かどうかを確認する必要があることを読みましたが、それは機能しません。つまり、実際には特定の列/行にのみ問題があります.

エラーが発生する部分は単純です

        while (cur.moveToNext())

編集:

問題が発生する部分の周りの完全なコード セグメント:

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

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

助けてください、何もできずにますます悪い評価が増えています

4

2 に答える 2

2

これは、Google に送信されたバグ ( http://code.google.com/p/android/issues/detail?id=32472 )に関連している可能性があります。割り当て済みと表示されていますが、昨年から活動が見られません。

(バグに従って、更新時に行数が異なる原因となるバッキング DB テーブルの行をCursorWindow更新していますか?)

于 2014-05-22T15:40:31.600 に答える