私にはわからないメモリの問題があります。私はすべてのデータベース検索作業を行う1つのクラスを持っています。私が持っているエラーは以下の通りです:私はこれを行うときカーソルを割り当てるときにメモリが不足する
android.database.CursorWindowAllocationException: Cursor window allocation of 2048 kb failed. # Open Cursors=733 (# cursors opened by this proc=733)
メモリ割り当てエラーが発生します。
mDatabaseInterface.getGraphForLevel(level);
私はおよそ2.5秒毎にこのメソッドを呼び出して、5ので、私はそれがリーク知っています6つの最初のコールが簡単に通過します。私はお互いを呼び出すが、このクラスが別のアプリで動作しますので、私はそれが再帰の問題ではないことを知っている方法の多くを持って
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));
}
:今ここに私のDatabaseInterfaceクラスのメソッドです。私の主な質問は、なぜcursor.close()
はカーソルを解放しないのですか?私が次のようなことをした場合:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
この場合、カーソルは保持されていますか?
ありがとうございます。
ノードとエッジのテーブルの大きさはどれくらいですか? – Matthieu
これは今は非常に小さく、行は20行10列です。 – chopchop