我正在寻找一段时间来回答我的问题,但我没有得到我需要的东西。我有一个带有ListView的应用程序,以及可以向DB添加新记录的表单。所以没有太多的疑问要做。
如何处理与db的连接?我应该在得到我想要的东西之后将其关闭,还是应该一直打开它直到应用程序关闭?我想知道在考虑性能和电池寿命时最好的方法是什么。
答案 0 :(得分:107)
根据this post by a Google engineer (Dianne Hackborn),将数据库连接保持打开没有错:
Android做出了刻意的设计决定,这看起来很令人惊讶, 只是放弃应用程序干净利落的整个想法 而是让内核清理他们的资源。毕竟, 内核需要能够做到这一点。鉴于设计,保持 任何在整个过程的生命周期内打开,永不关闭它只是一个泄漏。它将被清理干净 过程被清理干净。
因此,为简单起见,我将扩展Application类,为您的代码提供一个明确定义的入口点,并在其onCreate()
中打开数据库连接。将数据库连接存储为应用程序中的字段,并提供一种访问方法,使连接可用于其余代码。
然后,不要担心关闭它。
答案 1 :(得分:4)
建立与数据库的连接非常昂贵。如果连接没有短缺,并且数据库是本地的,那么我将保持连接打开而不是为数据库的每次写入操作建立连接,就像您通常在需要扩展到的数据库的客户端 - 服务器应用程序中那样容纳大量并发用户。
答案 2 :(得分:4)
一般情况下,我会在打开连接的Activity的onDestroy()函数中关闭连接。我将从使用光标的函数中的数据库中关闭()一个游标。
public MyActivity extends Activity{
private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper
private Cursor mCursor;
public MyActivity(Context context){
super(context);
initMemberVariables();
}
public ElementButton(Context context, AttributeSet attrS){
super(context, attrS);
initMemberVariables();
}
public ElementButton(Context context, AttributeSet attrS, int defStyle){
super(context, attrS, defStyle);
initMemberVariables();
}
private void initMemberVariables(){
mDatabase = new PSEdb(this.getContext());
}
private void getData(){
mCursor = mDatabase.MyGetterFunction();
while(mCursor.moveToNext()){
try{
// populate your data
}catch(CursorIndexOutOfBoundsException ex){
// handle the exception
}
}
mCursor.close();
}
@Override
public void onDestroy(){
super.onDestroy();
mDatabase.close();
}
}