2

Google Play のクラッシュ レポートに次のエラーがあり、修正方法がわかりません。

java.lang.IllegalStateException: Couldn't init cursor window
at android.database.CursorWindow.native_init(Native Method)
at android.database.CursorWindow.<init>(CursorWindow.java:41)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:276)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:268)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248)
at com.jim2.UpdateService.restaureNotifications(UpdateService.java:274)
at com.jim2.helpers.Globals.updateWidgets(Globals.java:1011)
at com.jim2.helpers.Globals.onReceive(Globals.java:746)
at com.jim2.UpdateService$5.onSignalStrengthsChanged(UpdateService.java:747)
at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:387)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3693)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:665)
at dalvik.system.NativeStart.main(Native Method)

クラッシュした私のコードは次のとおりです。

    DataBaseHelper d = new DataBaseHelper(context);
    Cursor c = d.getNotifications(false);
    SharedPreferences preferences;
    String ns = Context.NOTIFICATION_SERVICE;

    NotificationManager mNotificationManager = (NotificationManager)context.getSystemService(ns);

    CharSequence tickerText = "";

    if(c!=null && c.moveToFirst()){ // CRASH HERE :(

        do{
                       ....
       while(c.moveToNext());
       if(c!=null && !c.isClosed()) {
                c.close();c = null;
       }
    }
    d.close();

getNotifications からカーソルを取得するコードは次のとおりです。

public Cursor getNotifications(boolean all) {
        //removeAllNotifications();
        Cursor c;
        String fields[] = new String[] { "id", "ordre", "is_active"};
        String where = "is_active = 1";
        if(all)where = "";
        c = myDataBase.query(TABLE, fields, where, null, null, null, "ordre");

        return c;
    }

私の問題は、クラッシュを再現できないため、すべてのデバイスが正常に動作する原因を修正するのが難しいことです。

すでにこの投稿Android: Couldn't init Cursor Window but me it crash on moveToFirst not later and i already add code in answer.

どうもありがとう

4

2 に答える 2

5

この例外は、ネイティブ コードによってスローされます。(これを参照)

主な原因は、作成中の新しいカーソルにメモリを割り当てられなかったことにあります。だから私の推測では、フェッチしているデータが多すぎる(メモリ内で1M以上)か、新しいバッファを割り当てるためにメモリが不足するまで、カーソルを閉じずにたくさんのカーソルを開いていると思います。

  1. finallyコードを調べて、句内のすべてのカーソルを確実に閉じてください。
  2. データベースからフェッチされるデータが大きくなりすぎる可能性がある場合は、それらを別々のチャンクで取得します (何かのリストでさらにフェッチするためにプルを実行するなど)。

これが役立つかどうか教えてください。

于 2012-10-18T10:53:11.517 に答える
0

確かではありませんが、そうすべきではありません

        c = myDataBase.query(TABLE, fields, where, null, null, null, "ordre DESC")
于 2012-10-17T07:07:16.980 に答える