андроид.база данных.CursorWindowAllocationException: выделение окна Курсора 2048 КБ не удалось даже после закрытия курсора

есть много вопросов о so о CursorWindowAllocatoinException:

все они предполагают, что курсор должен быть закрыт после использовать. Но это не решило моей проблемы. Вот мой код:

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

Я запускаю этот метод каждые несколько секунд. Через полчаса я получаю CursorWindowAllocationException на int numRows=cur.getCount(); и тогда моя служба останавливается.

поскольку я закрываю курсор, может возникнуть проблема с моим вспомогательным классом. Вот код:

public class SettingsDatabaseHelper extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "mydb.db";
    private static final int DATABASE_VERSION = 1;


    private static final String TBL_CREATE="create table...";



    public SettingsDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(TBL_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onCreate(db);
    }
}

как я могу предотвратить это исключение?

3 ответов


я запрашивал базу данных у службы. Когда я делал это из деятельности, проблема больше не возникала.

наряду с запросом я читал из последовательного порта в той же службе. Возможно, это и стало причиной проблемы. Однако, когда я использовал действие вместо службы, проблема никогда не повторялась.


У меня была такая же проблема в моем приложении при загрузке более 500 песен из медиа маркета.

закрытие курсора не решит вашу проблему.

вы должны использовать AsyncTask.. внутри метода doInBackground напишите код для извлечения значений из курсора.

открытый класс CursorLoader расширяет 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) {


}

У меня была такая же проблема, когда я вызываю базу данных, в классе обслуживания, используя цикл forever.

мой код так:

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