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 回答