2013-11-26 2 views
0

Я обнаружил, что после каждого использования я должен закрыть переменную курсора. но проблема в том, что я пытаюсь вернуть курсор в качестве выхода функции. похоже, это невозможно. посмотрите на мой DbHelper, что я пытался закрыть мой курсор и базы данных в своих функциях:Когда следует закрывать переменную курсора?

общественного класса 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; 
} 

} 

}

Как это изменить?

ответ

0

После того, как вы это сделали, вы должны закрыть Cursor. Если вы вернете Cursor вызывающему абоненту, вы еще не закончили.

Некоторые опции:

  • Вызывающий, который получает Cursor становится ответственным за его закрытия.

  • Ваша функция копирует данные из Cursor в другую структуру данных, закрывает курсор и возвращает скопированные данные.

+0

Так что если я скопирую курсор в другую переменную, то, наконец, еще один курсор еще открыт! Есть ли проблемы с этим? –

+0

Не копируйте ссылку «Курсор», которая назначается другой переменной, но перемещайте курсор и копируйте каждую строку данных в структуру данных, такую ​​как «ArrayList». – laalto

Смежные вопросы