热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android对象加锁,android中数据库被锁住问题

注意:(1)这里的异常信息仅仅是android.database.sqlite.SQLiteException:databaseislocked,在我研发过程中&#x

uid-8789717-id-4067573.html

注意:

(1)这里的异常信息仅仅是android.database.sqlite.SQLiteException: database is locked, 在我研发过程中,还抛出了类似这样的异常信息。该异常是不可以被捕获的。           (2)android.database.sqlite.SQLiteException: database is locked(一些信息)。该异常是可以被捕获的。

这两种异常显然都是数据库被锁异常,但是异常信息不同,说明引起异常的原因也不同。

起初我认为这是由于在我操作数据库的方法前面加了synchronized的缘故,仔细想想,加这个是避免同时两个线程去写数据库,在逻辑上是完全这确的。去掉之后多线程访问数据库时,会出现数据库关闭的异常,这是由于线程B访问完数据库时,将数据库关闭,线程A再访问数据库引起,它们使用的是同一个数据库对象。

之后,我又查了很多资料,很多人提到了使用继承ContentProvider的方式,来解决该异常。

但是这种方式有2个弊端:

1.使用继承ContentProvider方式,会将项目的数据库暴露给第三方。一般系统级应用,如存储联系人,         存储短信的数据库才有必要暴露给第三方。

2.使用方式不如直接继承SQLiteOpenHelper对象简单。

Android技术文档提到:A content provider is only required if you need to share data between multiple applications. For example, the contacts data is used by multiple applications and must be stored in a content provider. If you don't need to share data amongst multiple applications you can use a database directly viaSQLiteDatabase.

如果需要在多个应用之间共享数据的话,ContentProvider方式才应该被使用。例如:联系人数据被多个应用使用,那么它就应该使用在ContentProvider方式存储。如果你不需要共享数据,那么仅仅使用SQLiteDatabase.数据库就可以了。

现在不使用继承ContentProvider的方式,我们该如何解决以上的异常呢?

The reason a ContentProvider solves the problem is because it usually uses one singleSQLiteOpenHelperwhich means that there is only one connection to the database and the underlyingSQLiteDatabasetakes care of the locking. You don't need a ContentProvider - just make sure you don't write to the DB using 2 different db connections.

A.ContentProvider能解决此问题的原因是它只用一个单一的SQLiteOpenHelper对象,也就是说在app中仅仅有一个“数据库连接” 连接着数据库并且由SQLiteOpenHelper中的SQLiteDatabase负责维护数据库的锁。

B. 你不需要一个ContentProvider - 只要确保不要用2个不同的“数据库连接”去连接数据库就可以了。

以下是我的数据库架构,希望能对大家有所帮助。

uid-8789717-id-4067573.html



推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
笃笃声_965
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有