2013-02-20 25 views
1

我得到這個錯誤:的Android CursorWindowAllocationException

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

光標開業時間:

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()
+0

移動新的遊標的第一個項目有什麼辦法,我可以使用相同的光標/覆蓋它在一個正確的方法,所以我不必做一個全新的光標? – user1880779 2013-02-20 23:25:34

+0

它只是您需要清理的舊遊標的引用,從您發佈的代碼開始,它看起來像DatabaseManager.getAllDataDay(...)必須始終返回一個新的遊標。 – 2013-02-20 23:28:06

+0

是的,但我如何使用相同的遊標名稱(因爲同樣的名字將再次用於「if」語句中)與我試圖獲得的新數據?我只關閉CursorDan遊標和CursorDan = DatabaseManager.getAllDataDay(danString);再次或? – user1880779 2013-02-20 23:55:03