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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fehler -12 bedeutet, dass cursor-Leck.
Pls versuchen Sie, schließen Sie es wie folgt:
InformationsquelleAutor will
War ich quering in einer Schleife. Und schließen Sie den cursor innerhalb der Schleife und nicht in der Außenwelt hat das problem gelöst.
InformationsquelleAutor Frozen Crayon
Android-Cursor Lesen alle Abfrage-Ergebnisse in den Speicher, und haben ein limit von 1 MB für Daten.
Diese Grenze wurde gewählt, weil diese Menge an Daten ist wahrscheinlich zu machen Ihre app schleppend laufen auf einem mobilen Gerät.
Sollten Sie, wenn möglich:
SELECT *
erhalten aber nur die Spalten, die Sie benötigen, und verwenden Sie eineWHERE
filter);Sie sind sicherlich mehr als einen Datensatz. Was ist das Ergebnis der entsprechenden
SELECT COUNT(*) ...
?InformationsquelleAutor CL.