1

このエラーが発生します:

E/AndroidRuntime(8223): Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=940 (# cursors opened by this proc=940)

カーソルを間違った方法で使用しているか、適切なタイミングで閉じていないことが原因である可能性があります。カーソルを閉じたり空にしたりせずに同じカーソルを埋めていることが原因である可能性がありますか?

public static void NextAlarmTxt(){
        int dan = c.get(Calendar.DAY_OF_WEEK);
        long trenutnovrijeme = c.getTimeInMillis();
        long bazavrijeme;
        long pamti = 0;
        String danString = dani(dan);       
        Cursor CursorDan = DatabaseManager.getAllDataDay(danString);


        CursorDan.moveToFirst();
        if (!CursorDan.isAfterLast())
        {
            do
            {
                bazavrijeme = CursorDan.getInt(2);

                if (trenutnovrijeme<bazavrijeme)
                {
                    if (pamti==0)
                    {
                        pamti = bazavrijeme;
                    }

                    if (pamti>0)
                    {
                    if (pamti > bazavrijeme)
                    {
                        pamti = bazavrijeme;
                    }
                    }                   
                }
                if (trenutnovrijeme > bazavrijeme)
                {
                    dan = dan+1;
                    dani(dan);
                    CursorDan = DatabaseManager.getAllDataDay(danString);
                }
            }
            while (CursorDan.moveToNext());         
        }               
        CursorDan.close();
        text1.setText(new StringBuilder("Sljedeći : " ).append(pamti).toString());
    }       
    public static String dani(int dan){

    String danString = null;

        if (dan==1)
        {
        danString = "Nedjelja";
        }
        else if (dan==2)
        {
            danString = "Ponedjeljak";
        }
        else if (dan==3)
        {
            danString = "Utorak";
        }
        else if (dan==4)
        {
            danString = "Srijeda";
        }
        else if (dan==5)
        {
            danString = "Četvrtak";
        }
        else if (dan==6)
        {
            danString = "Petak";
        }
        else if (dan==7)
        {
            danString = "Subota";
        }
        return danString;
    }
4

1 に答える 1

4

開いたカーソル:

Cursor CursorDan = DatabaseManager.getAllDataDay(danString);

その後、カーソルを反復処理し、

do {
...
if (trenutnovrijeme > bazavrijeme)
                {
                    dan = dan+1;
                    dani(dan);
                    CursorDan = DatabaseManager.getAllDataDay(danString);
                }
....
}
while (CursorDan.moveToNext());  

ここで、反復ループで、既存のカーソルを新しいカーソルで上書きします。これにより、既存のカーソルは開いたままになります。何を達成しようとしているのかはわかりませんが、この方法でカーソルの反復をネストするべきではありません。たとえそうしても、正しい順序で行う必要があります。

  1. 既存のカーソルを閉じる
  2. 新しいカーソルを取得する
  3. cursor.moveToFirst() で新しいカーソルを最初の項目に移動します
于 2013-02-20T23:10:04.140 に答える