`

Android Sqlite Database locked的问题

阅读更多

        SQLite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagename/databases/xxx.db这样的文件。

        我们可以得知SQLite是文件级别的锁:多个线程可以同时读,但是同时只能有一个线程写。Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用。

        如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。
        对于这样的问题,解决的办法就是keep single sqlite connection保持单个SqliteOpenHelper实例,同时对所有数据库操作的方法添加synchronized关键字。

 

 

在项目开发过程中,由于数据库的架构设计问题,会很容易出现以下异常:

android.database.sqlite.SQLiteException: <wbr>database <wbr>is <wbr>locked

注意:

   (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 via SQLiteDatabase. 

    

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

 

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

    The reason a ContentProvider solves the problem is because it usually uses one singleSQLiteOpenHelper which means that there is only one connection to the database and the underlyingSQLiteDatabase takes 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个不同的“数据库连接”去连接数据库就可以了。

     

分享到:
评论

相关推荐

    Android多线程操作sqlite(Sqlite解决database locked问题)

    通过以上策略,我们可以有效地在Android的多线程环境中管理SQLite数据库,防止“database locked”问题的发生。在实践中,应根据具体的应用场景和需求选择合适的解决方案,以保证应用的稳定性和性能。

    解决sqlite死锁示例异常database is locked示例

    总结来说,SQLite的死锁问题主要源于资源竞争和事务顺序,通过理解死锁产生的原因,结合异常处理、事务设计优化、日志监控等手段,可以有效地预防和解决"database is locked"异常。在实际开发中,应当重视数据库的...

    SQLite Database Browser for mac os

    10. **源代码开放**:SQLite Database Browser是一款开源软件,这意味着其源代码可供查看和改进,社区可以贡献新功能或修复问题。 总之,SQLite Database Browser是Mac OS用户管理SQLite数据库的理想选择,它简化了...

    SQLite Database Browser 2.0 b1.app.zip

    9. 日志和错误记录:SQLite Database Browser还提供了日志和错误记录功能,有助于追踪和解决操作过程中遇到的问题。 10. 支持多种操作系统:SQLite Database Browser跨平台运行,可以在Windows、Mac OS X和Linux等...

    SQLite Database System Design and Implementation

    从标题《SQLite Database System Design and Implementation》以及提供的部分内容来看,本书的核心知识点包括: 1. 关系型数据库管理系统(RDBMS)的基本概念:本书在开头部分回顾了关系型数据库的一些基础概念,...

    Android SQLite学习工具

    sqlite3 your_database.db ``` 在这个命令行环境下,你可以输入SQL命令进行数据操作,如`.tables`显示所有表,`.schema`查看表结构,`SELECT * FROM your_table;`查询表的所有数据等。 在实际开发中,除了使用...

    Android SQLite Database Tutorial_sql_android_

    在Android开发中,SQLite是一个重要的组成部分,它是轻量级的关系型数据库管理系统,广泛...查阅《Android SQLite Database Tutorial.pdf》文件,将提供更详细的操作示例和最佳实践,帮助你更好地掌握这一核心技术。

    Android例子源码解决多线程读写sqlite数据库锁定问题

    如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。对于这样的问题,解决的办法就是keep single ...

    Android SQLite ORM框架

    一个简单的Android SQLite ORM框架不想花资源分的同学可以上我的github主页下载:https://github.com/chenyihan/Simple-SQLite-ORM-Android,因为要传到github,所以代码中的注释和doc文档都是英文的,对自己英文不...

    sqlite数据库锁定问题.zip

    如果多线程同时读写(这里的指不同的线程用使用的是不同的Helper实例),后面的就会遇到android.database.sqlite.SQLiteException: database is locked这样的异常。对于这样的问题,解决的办法就是keep single ...

    sqlite死锁datebaselock解决方案

    在多线程环境下,由于并发操作不当,可能会出现“database is locked”(数据库被锁定)的错误,这通常涉及到SQLite的锁机制和事务处理。本文将深入探讨这个问题,并提供具体的解决方案。 一、SQLite锁机制 SQLite...

    pc6-SQLite Database Browser IPHONE

    SQLite Database Browser是一款专为IPHONE用户设计的数据库管理工具,主要功能是帮助用户查看、编辑和管理SQLite数据库。SQLite是一种轻量级的、开源的关系型数据库管理系统,广泛应用于移动设备和嵌入式系统中,...

    sqlite database browser windows版

    SQLite Database Browser是一款功能强大的、免费开源的SQLite数据库管理工具,专为Windows用户设计。它允许用户在无需深入了解SQL语法的情况下创建、编辑和管理SQLite数据库。SQLite本身是一个轻量级的、自包含的、...

    android sqlite可视化工具

    在Android开发中,SQLite是一个内置的关系型数据库系统,用于存储应用程序的数据。SQLite数据库因其轻量级、高效且易于集成的特点,被广泛应用于移动设备。为了更方便地管理和操作SQLite数据库,开发者通常会借助...

    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

    SQLiteDatabaseBrowser

    `SQLiteDatabaseBrowser`是一款专为SQLite数据库设计的轻量级图形用户界面(GUI)客户端工具。这个工具的主要目的是为了方便非技术用户以及开发者能够轻松地创建、查看、修改和管理SQLite数据库。SQLite本身是一种...

    SQLite Database Browser 2.0

    通过将.db文件从Android设备复制到电脑,开发者可以直接查看和修改数据库内容,这对于调试数据存储问题或构建离线测试场景非常有用。 总的来说,SQLite Database Browser 2.0 提供了一套全面的解决方案,无论你是...

    sqlite数据库编辑工具SQLiteDatabaseBrowser

    SQLite数据库编辑工具SQLiteDatabaseBrowser是一款强大的开源工具,专为管理和编辑SQLite数据库而设计。SQLite是一种轻量级的、自包含的、无服务器的、事务性的SQL数据库引擎,广泛应用于移动设备、嵌入式系统以及...

    测试android sqlite insert and delete 方法的返回值

    验证android sqlite数据库insert 和delete 方法返回值的具体规律 insert 插入一行,如果当前最大id是4,insert新的一条记录id是5 ,如果把5删除, 在insert一条新的记录id还是5,如果删除的是id为4的记录, 再新增一...

Global site tag (gtag.js) - Google Analytics