Konnte nicht reserviert werden CursorWindow

Ich bin, das in einem SQLite3 Datenbank in meine android-app. Gerade lese ich von der pre-besiedelten Datenbank, die über 200k Zeilen und 14 Spalten. Einträge sind Wörter. Datentyp aller Spalten ist text. Abfragen nach Worten, bis zu 11 Buchstaben (zB. AUFGABE) funktioniert einwandfrei. Aber für 12 oder größer (zB. AUFGEBEN) die app stürzt ab. Hier ist der logcat:

Could not allocate CursorWindow '//data//data//com.example.myapp//databases//database.sqlite' of size 2097152 due to error -12.
threadid=11: thread exiting with uncaught exception (group=0x40adf9f0)
FATAL EXCEPTION: Thread-2883
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=861 (# cursors opened by this proc=861)
at android.database.CursorWindow.<init>(CursorWindow.java:104)
at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:162)
at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
at com.example.myapp.MainActivity.query(MainActivity.java:815)
at com.example.myapp.MainActivity$2.run(MainActivity.java:356)
at java.lang.Thread.run(Thread.java:856)

code:

query = "select * from words where col_1 = \"" + (myWord)+ "\";";
cursor = database.rawQuery(query, null);
if (cursor != null)                                          
    cursor.moveToFirst(); // line 815
if (!cursor.isAfterLast()) {
    do {
        for (i = 1; i < cursor.getColumnCount(); i++) {
            temp = cursor.getString(i);
            //other stuff
        }
    } while (cursor.moveToNext());
    cursor.close();
}

So, was hat der Fehler zu bedeuten und warum ist die app abstürzt?

Der vollständige code wäre hilfreich. Schließen Sie den cursor, nachdem die Verwaltung es sich auch, warum nicht einfach rufen Sie den cursor.moveToNext() statt !cursor.isAfterLast()
Die vollständige app-code ist 1000 Zeilen. cursor.isAfterLast wird verwendet, um zu überprüfen, ob der cursor bewegt sich durch alle Ergebnisse, und wenn es hat, kann ich auch aufhören.
Schließen Sie den cursor in der while-Schleife ?
Nein. Habe vergessen zu einfügen, die Zeile im code oben.

InformationsquelleAutor Frozen Crayon | 2013-07-05

Schreibe einen Kommentar