2013-04-26 8 views
6

私はアンドロイド上のすべての連絡先を経由するアプリケーションを開発しました。すでに公開され、現在約800台のデバイスにインストールされています。ほぼすべてのデバイスで問題なく動作していますが、一部ではBugSense経由でエラーが発生していますが、まだ解決策が見つかりませんでした。ここでjava.lang.IllegalStateException:CursorWindowから行x col xを読み込めませんでした。カーソルが正しく初期化されていることを確認してください。

は、スタックトレース - 私は得ることのいずれかです。私のコードで

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上の別のスレッドを読みます。 Cursorがnullであるかどうかを調べる代わりに、それは機能しません。 つまり、実際には特定の列/行にのみ問題があります。問題が発生した部分、arroundの

完全なコード・セグメント:エラーが発生した

部分は、簡単な

 while (cur.moveToNext()) 

編集です

 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が更新されたときに行数が異なることが原因となるバッキングDBテーブルの行を更新している?)

2

moveToFirstを使用して位置決めカーソルを試して、その中からデータを読み取ろうとする前にそのカウントが空でないことを確認してください。

+0

SRYああ、didn'tことに言及。私はすでにカーソルを動かしています。ちょうどそれをメインポストに追加しました –

+0

あなたはまだカーソルの数をチェックしていません - カーソルが空で、 'moveToNext'ではありません – Asahi

+0

大丈夫、cursor.getColumCountではなくcursor.getCount () 以上です?このエラーを再現し、ソリューションが機能しているかどうかを確認するためのアイデアはありますか? –

関連する問題

 関連する問題