我有一个数据库处理程序类,用于查询数据库并返回游标。
这是方法:
public Cursor getData() {
String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_TEL,
KEY_EMAIL, KEY_COMMENTS };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
null, KEY_NAME + " ASC", null);
if (c != null) {
c.moveToFirst();
}
return c;
可以看出,我将指针设置为准备好返回的游标中的第一个元素。我目前正在收到“完成一个尚未停用或关闭的游标”异常,这是我使用的唯一游标,我没有明确地调用.close()。我的理由是它需要一个返回类型,我不能在返回之前关闭游标,因为这会设置一个nullpointer错误。
以下是返回光标后的处理方式:
DBHandler search = new DBHandler(this, null, null);
search.open();
Cursor cursor = search.getData();
search.close();
startManagingCursor(cursor);
有人能指出我正确的方向来帮助关闭数据库处理程序类中的游标。
答案 0 :(得分:2)
然后调用getCursor
的任何方法都有责任关闭它。使用Java 7的try-with-resources如下:
try(Cursor c = getData()) {
// ...
} // closes
或者根据需要尽快通过。调用堆栈的某个地方需要是负责管理游标资源的方法。这是使用尽可能多地留给垃圾收集器的语言进行权衡的一部分,在您需要管理自己的资源时留下笨拙的语法和语义。
答案 1 :(得分:0)
你必须这样使用。
public Cursor getData() {
String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_TEL, KEY_EMAIL, KEY_COMMENTS };
return ourDatabase.query(DATABASE_TABLE, columns, null, null, null,null, KEY_NAME + " ASC", null);
}
现在您必须迭代cursor
,当您完成工作后,请关闭cursor
。
DBHandler search = new DBHandler(this, null, null);
search.open();
Cursor record = search.getData();
//startManagingCursor(record);
if(record.getCount()!=0){
if(record.moveToFirst()){
do{
//your code here.
}while(record.moveToNext());
}
}
record.close();
search.close();
试试这个。