关闭数据库连接的最佳位置

时间:2011-07-07 09:31:50

标签: android database sqlite

我正在寻找一段时间来回答我的问题,但我没有得到我需要的东西。我有一个带有ListView的应用程序,以及可以向DB添加新记录的表单。所以没有太多的疑问要做。

如何处理与db的连接?我应该在得到我想要的东西之后将其关闭,还是应该一直打开它直到应用程序关闭?我想知道在考虑性能和电池寿命时最好的方法是什么。

3 个答案:

答案 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();
    }
}