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

Fix*_*xus 54 database sqlite android

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

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

Gra*_*and 111

根据谷歌工程师(Dianne Hackborn)的这篇文章,让数据库连接保持打开没有错:

Android做出了一个刻意的设计决定,看起来令人惊讶,只是放弃了应用程序干净利落的整个想法,而是让内核清理他们的资源.毕竟,内核需要能够做到这一点.鉴于这种设计,在整个过程的整个过程中保持 任何开放状态并且永不关闭它根本不是泄漏.清理过程后将清理它.

因此,为简单起见,我将扩展Application类,为您的代码提供一个明确定义的入口点,并在其中打开数据库连接onCreate().将数据库连接存储为应用程序中的字段,并提供一种访问器方法,以使连接可​​用于其余代码.

然后,不要担心关闭它.

  • @JānisGruzis除了总是有效的东西之外,任何替代方案怎么会"更好",而且非常简单? (6认同)
  • 考虑到*getWritableDatabase()*上的文档,这看起来有点奇怪:`创建和/或打开一个用于读写的数据库......一旦成功打开,数据库就会被缓存,所以你可以每次调用这个方法你需要写入数据库的时间.(确保在不再需要数据库时调用close().)` (5认同)
  • @ Mahm00d以及您绝对确定"不再需要数据库"的时刻是操作系统关闭您的应用程序的时间点.所以让操作系统为您处理.:) (5认同)
  • @JānisGruzis这是Android内核所依赖的Linux内核的功能; 当一个进程(即你的应用程序)终止时,操作系统将清理*没有持久化的所有内容*(例如,磁盘):所有内存都被回收,所有句柄都被关闭等等.话虽如此,我更喜欢"明确"关于生命... (4认同)
  • 对于快速修复,这是一个很好的答案,但可能通过制定良好的程序流程并首先进行规划可以做得更好. (3认同)
  • 好吧让数据库连接保持打开似乎是不好的做法,即使它说应用程序已经死了也会关闭,我还没有在Android文档中遇到过这种行为的描述,如果是这样,那总是意味着更多的Android工作(保持连接)并关闭它们).如果两个应用程序并行工作(它们可以在服务和活动的同时工作)并且它们都保持连接打开,会发生什么.当然情况并非如此,这就是我投票支持这个解决方案的原因. (3认同)
  • ......而且不仅仅是"Google工程师"! (2认同)

Dar*_*har 5

一般来说,我会在打开连接的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 4

建立与数据库的连接是昂贵的。如果连接不短缺,并且数据库是本地的,我会保持连接打开,而不是为数据库的每个写入操作建立连接,就像您通常在需要扩展的客户端-服务器应用程序中所做的那样容纳大量并发用户。