我在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
我该怎么办?我应该如何关闭这个类中的光标?
答案 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)
你好我面对同样的问题我已经解决了这个问题,如
当我查询并返回ArrayList
或JSON 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;
}
这仅用于返回一条记录,用于重新调整记录集我使用此库
它将管理游标操作本身并返回sqliteCursorLoader