`
guibin
  • 浏览: 366214 次
  • 性别: 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里关闭了,但是还是报这个错误。

相关推荐

    android-database-sqlcipher-4.4.0+sqlite-2.1.0.zip

    android-database-sqlcipher-4.4.0和sqlite-2.1.0 官网下载太慢了,还总是下不下来,终于下载下来就分享出来。 安装清参考博客:https://blog.csdn.net/zdwcmy/article/details/106990422

    Android-sqlite-android一个AndroidSQLite支持库

    总之,`sqlite-android`是一个强大的Android ORM框架,它使得在Android应用中处理SQLite数据库变得更加简单和高效。通过合理使用,开发者可以专注于业务逻辑,而不用过于关注数据库操作的细节。

    Android代码-react-native-sqlite-storage

    react-native-sqlite-storage SQLite3 Native Plugin for React Native for both Android (Classic and Native) and iOS Inspired by fantastic work done by Chris Brody I did not want to re-invent the wheel. ...

    android-sqlite-encrypt

    "android-sqlite-encrypt"库的核心功能在于对SQLite数据库进行透明的加密,这意味着开发者可以使用标准的SQLite API进行操作,而无需额外处理加密和解密的逻辑。该库利用了SQLCipher的加密算法,这是一种开源的、...

    android-database-sqlcipher-4.4.0+androidx-\sqlite-2.1.0.zip

    android-database-sqlcipher-4.4.0、sqlite-2.1.0

    sqlite-jdbc-3.36.0.3.jar

    sqlite-jdbc-3.36.0.3.jar 最新吧2021 8月底更新

    sqlite-jdbc-3.34.0.jar

    sqlite-jdbc-3.34.0.jar,支持M1芯片了,Android Studio可以正常链接手机了

    sqlite-jdbc-3.31.1.zip

    在本案例中,“sqlite-jdbc-3.31.1.zip”是一个包含SQLite JDBC驱动的压缩包,版本号为3.31.1,用于在Java环境中通过JDBC方式连接和操作加密后的SQLite数据库。 首先,我们需要了解如何在Java项目中使用sqlite-jdbc...

    sqlite-devel-3.7.17-8.el7.x86_64.rpm

    sqlite-devel-3.7.17-8.el7.x86_64.rpm

    sqlite jdbc jar java jdbc 链接 sqlite sqlite-jdbc-3.8.11.1.jar

    在本场景中,我们关注的是如何使用 `sqlite-jdbc-3.8.11.1.jar` 这个特定版本的驱动来实现 Java 与 SQLite 的交互。 首先,要使用 SQLite JDBC,你需要将 `sqlite-jdbc-3.8.11.1.jar` 添加到你的项目类路径中。如果...

    sqlite-jdbc-3.8.7.jar下载

    8. **错误处理和异常安全**:在使用SQLite JDBC驱动时,应始终捕获并适当地处理可能出现的`SQLException`和其他相关异常,以确保程序的健壮性。 9. **安全性**:虽然SQLite是本地数据库,但依然需要考虑安全性问题...

    Sqlite-jdbc-3.7.2.jar和sqlite-jdbc-3.20.1.jar上传,亲测可用

    本主题主要围绕“Sqlite-jdbc-3.7.2.jar”和“sqlite-jdbc-3.20.1.jar”两个Java JDBC驱动进行讨论,它们是Java连接SQLite数据库的关键组件。 Sqlite-jdbc驱动是Java开发者用来与SQLite数据库进行交互的桥梁。JDBC...

    sqlite-3.7.15&sqlite-jdbc-3.7.15

    sqlite-jdbc是Java语言连接SQLite数据库的驱动,允许Java应用程序通过JDBC接口与SQLite进行交互。版本3.7.15-M1是该驱动的一个特定构建,用于支持SQLite 3.7.15数据库引擎。开发者可以使用这个驱动在Java程序中执行...

    android-sqlite-hibernate

    2. sqlite-java-tool pc端(包括windows,linux,mac)下的sqlite数据库操作工具,该工具是基于sqlite-annotation-convention插件的,实现了许多常用的操作,你也可以直接编写sql代码,然后通过该工具执行。

    sqlite-shell-win32-x86-3080200.zip

    "sqlite-shell-win32-x86-3080200.zip" 是SQLite针对Windows 32位平台的命令行接口(shell)的压缩包,版本号为3.8.2.0。这个压缩包包含了一个名为"sqlite3.exe"的可执行文件,它是SQLite Shell,也就是SQLite的...

    sqlite-jdbc

    这个压缩包包含两个版本的sqlite-jdbc驱动,分别是`sqlite-jdbc-3.7.2.jar`和`sqlite-jdbc-3.8.11.2.jar`。这两个JAR文件都是SQLite JDBC的实现,允许Java应用通过JDBC接口连接到SQLite数据库,从而执行查询、数据...

    Sqlite-netFx45 32bit + 64bit.rar

    下载文件包括: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....

    Android SQLite--小巧好用的SQLite GUI管理工具

    因此,SQLiteSpy使用远低于其它的SQLite管理内存和更有效地处理大量的表。 11、内建的SQLite引擎: SQLiteSpy已建成一个单一的应用程序文件与SQLite数据库引擎可执行文件。不需要部署任何DLL文件,这使得SQLiteSpy...

    .net连接sqlite引用库包含32位和64位程序 sqlite-netFx40-2010.rar

    `sqlite-netFx40-2010.rar`这个压缩包提供了针对.NET Framework 4.0的SQLite连接支持,特别考虑了32位(x86)和64位(x64)系统的兼容性。 SQLite的引入使得开发者能够在.NET环境中轻松地进行数据库操作。在.NET中...

    sqlite-shell-win32-x86: sqlite3.exe

    --sqllite3 sqlite-shell-win32-x86: sqlite3.exe --svn执行clean up命令时报错“Previous operation has not finished; run 'cleanup' if it was interrupted”。 解决此问题所需文件 2. 为了方便命令行执行,将...

Global site tag (gtag.js) - Google Analytics