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生命周期的一部分,不一定会被调用。
分享到:
相关推荐
android-database-sqlcipher-4.4.0和sqlite-2.1.0 官网下载太慢了,还总是下不下来,终于下载下来就分享出来。 安装清参考博客:https://blog.csdn.net/zdwcmy/article/details/106990422
sqlite-android一个Android SQLite支持库
sqlite-jdbc-3.36.0.3.jar 最新吧2021 8月底更新
android-database-sqlcipher-4.4.0、sqlite-2.1.0
sqlite-jdbc-3.34.0.jar,支持M1芯片了,Android Studio可以正常链接手机了
sqlite-3.7.15&sqlite-jdbc-3.7.15 sqlite是sourceforge上的资源,sqlite-jdbc是Maven上的资源
sqlite-jdbc-3.20.1.jar 连接Java和sqlite的最新驱动!
2. sqlite-java-tool pc端(包括windows,linux,mac)下的sqlite数据库操作工具,该工具是基于sqlite-annotation-convention插件的,实现了许多常用的操作,你也可以直接编写sql代码,然后通过该工具执行。
android-sqlite-encrypt是一个支持加密的SQLITE SDK。
sqlite-devel-3.7.17-8.el7.x86_64.rpm
sqlite-shell-win32-x86-3080200.zip sqlite的windows版本
官方版本,亲测可用
sqlite-jdbc-3.8.7.jar下载,用于java与sqlite数据库的连接
SQLite数据库是文档型数据库,其具备体积小移动方便等特点;以下jar包:sqlite-jdbc-3.30.1.jar文件为SQLite数据库对应的数据库驱动jar包;
sqlite-netFx40-binary-bundle-Win32-2010-1.0.94.0 解决 “异常来自 HRESULT:0x8007007E” 这个问题。
A bundle of command-line tools for managing SQLite database files, including the command-line shell program, the sqldiff.exe program, and the sqlite3_analyzer.exe program. (sha1: ef57a371cec5e8d3c812e...
sqlite-netFx46-setup-bundle-x64-2015-1.0.108.0, 安装版
下载文件包括:sqlite-netFx45-binary-Win32-2012-1.0.98.0.zip和sqlite-netFx45-binary-x64-2012-1.0.98.0.zip两个文件(均系官网下载)。 含net环境下使用SQLite所需dll,System.Data.SQLite.dll、SQLite.Interop....
因此,SQLiteSpy使用远低于其它的SQLite管理内存和更有效地处理大量的表。 11、内建的SQLite引擎: SQLiteSpy已建成一个单一的应用程序文件与SQLite数据库引擎可执行文件。不需要部署任何DLL文件,这使得SQLiteSpy...
sqlite-net is an open source, minimal library to allow .NET and Mono applications to store data ...sqlite-net was designed as a quick and convenient database layer. Its design follows from these *goals*: