android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed even after closing cursor android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed even after closing cursor sqlite sqlite

android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed even after closing cursor


I was querying the database from a service. When I did it from an activity, the problem never occurred again.

Alongside querying, I was reading from the serial port within the same service. Maybe that caused the problem. However, when I used an activity instead of the service, the problem never happened again.


i had the same problem in my application while loading more than 500 songs from android media store.

closing the cursor will not solve your problem.

you should use AsyncTask..inside doInBackground method write the code for retrieving values from cursor.

public class CursorLoader extends AsyncTask {

    @Override    protected Void doInBackground(Void... params) {        String query = "select serial from tbl1 union select serial from tbl2 union select serial from tbl3";SQLiteDatabase db = null;Cursor cur = null;try {    SettingsDatabaseHelper dal = new SettingsDatabaseHelper(            c);    db = dal.getReadableDatabase();    cur = db.rawQuery(query, null);    int numRows = cur.getCount();    if (numRows > 0) {        cur.moveToFirst();        int serialIdx = cur.getColumnIndexOrThrow("serial");        for (boolean hasItem = cur.moveToFirst(); hasItem; hasItem = cur                .moveToNext()) {            String serial = cur.getString(serialIdx);            if (Validator.getInstance().isValidSerial(serial))                serials.add(serial);        }    }} finally {    if (cur != null)        cur.close();    if (db != null)        db.close();}        return null;    }    @Override    protected void onPreExecute() {    }    @Override    protected void onPostExecute(Void result) {}


I had the same problem, while i am calling the DATA BASE, in the service class using forever loop.

My code was like:

service () {void run()   {     while(conditionisTrue)       {              db.getRecord();  //I remove this code from here and put it in the start of service c        }    } }