android.database.CursorWindowAllocationException: Die Zuweisung des Cursorfensters von 2048 KB ist auch nach dem Schließen des Cursors fehlgeschlagen

Es gibt viele Fragen zu CursorWindowAllocatoinException zu SO:

SQLite Android Database Cursor-Fensterzuordnung von 2048 KB fehlgeschlagenCursorWindow konnte nicht zugeordnet werdenNicht genügend Speicher beim Zuweisen von CursornAndroid SQLite CursorWindowAllocationException stürzt ab

Alle von ihnen schlagen vor, dass der Cursor nach der Verwendung geschlossen werden muss. Aber das hat mein Problem nicht gelöst. Hier ist mein Code:

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

Ich führe diese Methode alle paar Sekunden aus. Nach einer halben Stunde verstehe ichCursorWindowAllocationException imint numRows=cur.getCount(); und dann hört mein Dienst auf.

Da ich den Cursor schließe, liegt möglicherweise ein Problem mit meiner Helper-Klasse vor. Hier ist der Code:

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

Wie kann ich verhindern, dass diese Ausnahme ausgelöst wird?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage