Ich habe ein Speicherproblem, das ich nicht herausfinden kann. Ich habe eine Klasse, die alle meine Datenbank-Abruf-Arbeit erledigt. Der Fehler, den ich habe, ist folgendes:Nicht genügend Speicher beim Zuweisen von Cursorn
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
Die Speicherzuordnungsfehler tritt auf, wenn ich dies tun:
mDatabaseInterface.getGraphForLevel(level);
Ich weiß, dass es ein Leck ist, weil ich diese Methode alle 2,5 Sekunden rufen grob, und die 5 oder 6 erste Anrufe gehen leicht durch. Hier sind die Methoden in meiner DatabaseInterface Klasse:
public Graph getGraphForLevel(Level level) {
//get the nodes
ArrayList<Node> nodes = new ArrayList<Node>(Arrays.asList(this.getNodesWithLevel(level)));
//get the edges
ArrayList<Edge> edges = new ArrayList<Edge>(Arrays.asList(this.getEdgesWithNodes(nodes)));
return new Graph(nodes, edges);
}
public Node[] getNodesWithLevel(Level level) {
List<Node> l = new ArrayList<Node>();
Cursor cursor = mDatabase.query("nodes", null,
"level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);
while (cursor.moveToNext()) {
l.add(parseNodeFromCursor(cursor));
}
cursor.close();
return l.toArray(new Node[l.size()]);
}
private Node parseNodeFromCursor(Cursor cursor) {
Level l = getLevelWithId(cursor.getInt(2));
return new Node(cursor.getInt(0), cursor.getString(1), l,
cursor.getInt(4), cursor.getInt(5));
}
ich viele Methoden, die sich gegenseitig anrufen, aber ich weiß, es ist kein Problem, weil Rekursion diese Klasse in einer anderen App funktioniert. Meine Hauptfrage ist, warum nicht cursor.close()
den Cursor freigibt? Wenn ich etwas mache wie:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
Wird der Cursor in diesem Fall beibehalten?
Vielen Dank im Voraus.
Nur um eine Idee zu bekommen, wie groß sind die Tabellen für Knoten und Kanten? – Matthieu
Sie sind sehr klein für jetzt, 20 Zeilen und 10 Spalten höchstens – chopchop