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

本文详细介绍了在Android应用开发中如何通过复写onDestroy函数并关闭数据库,解决数据库未明确关闭导致的异常问题。重点阐述了onDestory函数的作用、存储数据逻辑的正确放置位置,以及关闭数据库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

@Overrideprotected 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生命周期的一部分,不一定会被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值