SQLite游标错误:内存不足

时间:2014-12-16 23:16:24

标签: android

我有一个我无法弄清楚的记忆问题。

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次时抛出异常。

2 个答案:

答案 0 :(得分:0)

关闭你的游标!:

    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();
        ...                
    }
  

此错误的原因通常是非关闭游标。

答案 1 :(得分:0)

@Jorgesys答案大部分已经完成。 我认为应该解决这个问题 原因是Cursor每次都不接近,但最好有

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

要记住的一点是,android Cursor窗口限制为2Mb。
因此,当您查询数据(尤其是BLOB)时,的大小不应超过限制
要解决这个问题,将查询划分为较小的部分再次考虑数据库设计