0

我有一个数据库处理程序类,用于查询数据库并返回游标。

这是方法:

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()。我这样做的原因是它需要一个返回类型,我不能在返回它之前关闭游标,因为这会设置一个空指针错误。

以下是游标返回后的处理方式:

    DBHandler search = new DBHandler(this, null, null);

    search.open();
    Cursor cursor = search.getData();
    search.close();
    startManagingCursor(cursor);

有人可以指出我正确的方向以帮助关闭我的数据库处理程序类中的光标。

4

2 回答 2

3

然后无论调用什么方法都getCursor负责关闭它。像这样使用 Java 7 的 try-with-resources:

try(Cursor c = getData()) {
    // ...
} // closes

或者尽可能高地传递。调用堆栈的某处需要一个负责管理游标资源的方法。这是使用尽可能多地留给垃圾收集器的语言进行权衡的一部分,当您确实需要管理自己的资源时留下笨拙的语法和语义。

于 2013-03-19T03:30:03.510 回答
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();

试试这个。

于 2013-03-19T04:34:07.943 回答