我有一个无法弄清楚的内存问题。
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(时,大小不应大于限制。
要解决这个问题,请将查询分成较小的部分或重新考虑数据库设计