我什么时候应该关闭游标变量?

时间:2013-11-26 11:50:26

标签: android android-cursor sqlite

我发现我应该在每次使用后关闭我的游标变量。但问题是当我试图将光标作为函数的输出返回时。似乎不可能。看看我的DbHelper,我试图在我的函数中关闭我的光标和数据库:

public class DbHelper扩展了SQLiteOpenHelper {

public DbHelper(Context context) {
    super(context, "shareholders.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        String sql = "CREATE TABLE IF NOT EXISTS news (id integer,title text,description text,sDate text)";
        db.execSQL(sql);
        sql = "CREATE TABLE IF NOT EXISTS cities (id integer,name text)";
        db.execSQL(sql);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
}

@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    // TODO Auto-generated method stub

}

public long insert(String table,ContentValues cv){
    SQLiteDatabase mydb =this.getWritableDatabase();
    long result=-1;
    try {
        result = mydb.insert(table,null, cv);
        }catch (Exception e) {
        xLog.error(e.getMessage());
    }
    finally{
        mydb.close();
    }
    return result;
}

public Cursor selectAll(String table){
    SQLiteDatabase mydb =this.getReadableDatabase();
    String sql = "SELECT * FROM "+table;
    xLog.info(sql);
    Cursor result=null;
    try {
        result = mydb.rawQuery(sql, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    finally{
        result.close();
        mydb.close();
    }
    return result;
}

public Cursor select(String table,String where){
    SQLiteDatabase mydb =this.getReadableDatabase();
    String sql = "SELECT * FROM "+table+" WHERE "+where;
    xLog.info(sql);

    Cursor result=null;
    try {
        result = mydb.rawQuery("SELECT * FROM "+table+" WHERE "+where, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    finally{
        result.close();
        mydb.close();
    }
    return result;
}

public long update(String table,ContentValues cv,String condition){
    SQLiteDatabase mydb =this.getWritableDatabase();
    long result = -1;
    try {
        result = mydb.update(table, cv, condition, null);
    } catch (Exception e) {
        xLog.error(e.getMessage());
    }
    finally{
        mydb.close();
    }
    return result;
}

}

}

如何更改?

1 个答案:

答案 0 :(得分:0)

使用完毕后,您应关闭Cursor。如果您将Cursor返回给来电者,那么您还没有完成。

一些选项:

  • 收到Cursor的来电者有责任关闭它。

  • 您的函数将数据从Cursor复制到其他一些数据结构,关闭光标并返回复制的数据。