正确关闭此游标对象以防止游标异常的方法

时间:2013-03-19 03:27:53

标签: java android

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

这是方法:

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);

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

2 个答案:

答案 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();

试试这个。