SQLite 游标错误:内存不足



我有一个无法弄清楚的内存问题。

12-17 00:03:10.603: E/AndroidRuntime(19910): android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=723 (# cursors opened by this proc=723)

仅当我刷新页面 15-20 次(每次进行 30 次查询(时,才会发生这种情况。

        Cursor c;
        for(w = 0; w < 30; w++)
        {   
            ...
            c = dataBase.fetchA();  
            int valueColIncome = c.getColumnIndex(myDatabase.IEMetaData.IE_VALUE); 
            if(c.moveToFirst())
            {  
                do              
                {   
                    ...
                }while(c.moveToNext()); 
            }
            c = dataBase.fetchB();
            if(c.moveToFirst())
            {  
                do              
                {                   
                    ...
                }while(c.moveToNext()); 
            }
            ...                
        }
        c.close();

我还尝试在 for 中的每个循环创建一个光标,然后关闭它,但没有任何变化。当我刷新此活动超过 15 次时,将引发异常。

关闭光标!

    for(w = 0; w < 30; w++)
    {   
        ...
        c = dataBase.fetchA();  
        int valueColIncome = c.getColumnIndex(myDatabase.IEMetaData.IE_VALUE); 
        if(c.moveToFirst())
        {  
            do              
            {   
                ...
            }while(c.moveToNext()); 
        }
        c.close();
        c = dataBase.fetchB();
        if(c.moveToFirst())
        {  
            do              
            {                   
                ...
            }while(c.moveToNext()); 
        }
        c.close();
        ...                
    }

大多数情况下,此错误的原因是未关闭的游标。

@Jorgesys答案大部分都完成了。我认为它应该解决问题。
原因是光标不是每次都关闭,但最好有

for() {
Cursor c;
.....
c.close();
}

要记住的一件事是,android Cursor窗口仅限于2Mb。
因此,当您查询数据(尤其是 BLOB(时,大小不应大于限制
要解决这个问题,请将查询分成较小的部分重新考虑数据库设计

最新更新