android-如何关闭像这样的类中的游标

时间:2014-07-07 06:07:01

标签: android android-sqlite android-cursor

我在dbhelper类中有这个函数:

public Cursor getRow(long rowId) {
    String where = KEY_ROWID + "=" + rowId;
    Cursor c = db.query(DATABASE_TABLE, ALL_KEYS, where, null, null, null,null, null);
    if (c != null) {
        c.moveToFirst();
    }

    return c;
}

当我来到这个类调用的活动时,我收到此错误(请注意,当我进入此活动时,我在离开活动时得到此错误):

Finalizing a Cursor that has not been deactivated or closed. database......
Application did not close the cursor or database object that was opened here

这是一个很长的错误。

有人叫我用c.close();以上返回c,类似这样:

public Cursor getRow(long rowId) {
        String where = KEY_ROWID + "=" + rowId;
        Cursor c = db.query(DATABASE_TABLE, ALL_KEYS, where, null, null, null,null, null);
        if (c != null) {
            c.moveToFirst();
        }
        c.close();
        return c;
    }  

我试了但是现在我收到了这个错误:

Access closed cursor

我该怎么办?我应该如何关闭这个类中的光标?

3 个答案:

答案 0 :(得分:2)

您应该关闭Cursor中的Activity。喜欢

 Cursor c=getRow(rowID_Value);
 c.close();

使用DB后,您必须关闭此Cursor

答案 1 :(得分:1)

使用getRow功能后关闭光标,即

public Cursor getRow(long rowId) {
        String where = KEY_ROWID + "=" + rowId;
        Cursor c = db.query(DATABASE_TABLE, ALL_KEYS, where, null, null, null,null, null);
        if (c != null) {
            c.moveToFirst();
        }
        return c;
    } 

并像这样使用

Cursor c1 = getRow(rowId);
//use cursor 
//....
if(c1 != null)c1.close();

注意:rowId是您希望从数据库中以长格式显示的行的值。

修改

在您的活动类中创建Cursor c1; 首先检查游标是否为空,然后关闭它。

if(c1 != null)c1.close(); 

然后将光标变为

 c1 = getRow(rowId);

onStop / onDestroy将光标关闭为

if(c1 != null)c1.close();

答案 2 :(得分:0)

你好我面对同样的问题我已经解决了这个问题,如

当我查询并返回ArrayListJSON object而不是cursor

您可能需要更改查询

public JSONObject getRow(long rowId) {
    String where = KEY_ROWID + "=" + rowId;
    Cursor c = db.query(DATABASE_TABLE, ALL_KEYS, where, null, null, null,null, null);
   if (c!= null & c.moveToFirst()) {
        JSONObject jsonObj = new JSONObject();

         jsonObj.put("key_Name", c.getString(c.getColumnIndex("your_column_name")));
         // do for your all column and return this jsonObj and before returning close cursor
    }
    c.close();
    return jsonObj;
}  

这仅用于返回一条记录,用于重新调整记录集我使用此库

  

https://github.com/commonsguy/cwac-loaderex

它将管理游标操作本身并返回sqliteCursorLoader