我有一个记忆问题,我不能解决。我有一个类来完成我所有的数据库检索工作。我得到的错误如下:
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次很容易完成。下面是我的DatabaseInterface类中的方法:
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));
}
我有很多相互调用的方法,但我知道这不是一个递归问题,因为这个类可以在另一个应用程序中工作。我的主要问题是为什么cursor.close()
不释放游标?如果我这样做:
cursor = mDatabase.query(...);
cursor.moveToNext();
Node node = new Node(cursor.getInt());
cursor.close();
在这种情况下光标是否会保留?
提前谢谢。
发布于 2012-09-25 17:20:18
对cursor.close()
的调用应该在finally
块中,以防在迭代时抛出异常。
Cursor cursor = mDatabase.query("nodes", null,
"level = " + wrapSql(String.valueOf(level.getId())), null, null, null, null);
try {
while (cursor.moveToNext()) {
l.add(parseNodeFromCursor(cursor));
}
} finally {
cursor.close();
}
https://stackoverflow.com/questions/12577400
复制相似问题