`
guibin
  • 浏览: 363629 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

处理Android SQLite - close() was never explicitly called on database异常

阅读更多
Android SQLite - close() was never explicitly called on database
guibin.beijing@gmail.com

在开发Android应用过程中,如果不小心会遇到如下所示的异常:
引用
E/Database(3150): close() was never explicitly called on database ......


解决其实很简单,只要复写activity的onDestroy函数,在onDestroy中关闭数据库即可。

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (dbHelper  != null) {
            dbHelper.close();
        }
    }


不要忘记在dbHelper即Database Adapter中添加close函数,如下所示:

   public void close() {
        if (mDbHelper != null) {
        mDbHelper.close();
        }
    }


下面详细说说onDestory函数。onDestory函数用于在activity被销毁前执行最终的清理工作。这个destory行为发生在:
1) 该activity被其他人调用了它的finish函数
2) 或者由于系统需要回收资源而临时销毁该activity实例。
在程序中可以使用isFinishing函数来判别具体是因为以上哪种原因销毁该activity。

注意:
不要把存储数据的逻辑放在onDestroy函数中,这个回调函数只是用来清理释放资源的,比如释放与该activity相关的线程,关闭数据库等。
不建议把存储数据的逻辑放在onDestroy中的原因是在某些情况下,系统会简单的kill该activity所在的主线程而不调用onDestroy。

那么存储数据的逻辑应该放在哪里呢?答案是 onPause() 和 onSaveInstanceState(Bundle)中。
onSaveInstanceState(Bundle)会在该activity被系统kill前调用,以至于将来该activity能从之前存储的状态恢复。
onPause会在该activity进入后台而未被系统杀掉时调用。
onSaveInstanceState(Bundle)和onPause有点让人混淆,这两者的区别是:onPause是activity的生命周期的一部分,它一定会被调用(当该activity进入后台或者即将被销毁),而onSaveInstanceState(Bundle)则不是activity生命周期的一部分,不一定会被调用。
分享到:
评论
1 楼 fyc0109 2012-12-19  
那我的SimpleCursorAdapter的Cursor怎么关闭?我也在OnDestroy里关闭了,但是还是报这个错误。

相关推荐

Global site tag (gtag.js) - Google Analytics