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

2024-02-07 20:08

本文主要是介绍处理Android SQLite - close() was never explicitly called on database异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

解决其实很简单,只要复写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 SQLite - close() was never explicitly called on database异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/688788

相关文章

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

sql语句字段截取方法

《sql语句字段截取方法》在MySQL中,使用SUBSTRING函数可以实现字段截取,下面给大家分享sql语句字段截取方法,感兴趣的朋友一起看看吧... 目录sql语句字段截取sql 截取表中指定字段sql语句字段截取1、在mysql中,使用SUBSTRING函数可以实现字段截取。例如,要截取一个字符串字

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU