一个SQLiteReadOnlyDatabaseException的问题

2023-11-07

最近测试同事上报了随机的一个crash问题,看日志是SQLiteReadOnlyDatabaseException的问题,发生在update数据库的时候。我自己写的ContentProvider代码就是在程序目录下放置数据,所以不是网上常见的缺少写sd卡权限的原因。具体分析要看日志:

06-08 10:31:46.358  1913  1913 E AndroidRuntime: android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (code 1032)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:741)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1606)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1552)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at com.hb.provider.HbSettingProvider.update(HbSettingProvider.java:90)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.content.ContentProvider$Transport.update(ContentProvider.java:366)
06-08 10:31:46.358  1913  1913 E AndroidRuntime: 	at android.content.ContentResolver.update(ContentResolver.java:1411)
日志中有个code 1032,这个会提供更具体的信息,网络搜索到信息如下:

SQL return code 1032 SQLITE_READONLY_DBMOVED
The SQLITE_READONLY_DBMOVED error code is an extended error code for SQLITE_READONLY. The SQLITE_READONLY_DBMOVED error code indicates that a database cannot be modified because the database file has been moved since it was opened, and so any attempt to modify the database might result in database corruption if the processes crashes because the rollback journal would not be correctly named.

看出这个真正的原因是物理数据库文件已被移除,和SQLiteReadOnlyDatabaseException的字面意思有差距,并不是数据库只读。

参见SQLiteOpenHelper源码

frameworks/base/core/java/android/database/sqlite/SQLiteOpenHelper.java

    public SQLiteDatabase getWritableDatabase() {
        synchronized (this) {
            return getDatabaseLocked(true);
        }
    }

    private SQLiteDatabase getDatabaseLocked(boolean writable) {
        if (mDatabase != null) {
            if (!mDatabase.isOpen()) {
                // Darn!  The user closed the database by calling mDatabase.close().
                mDatabase = null;
            } else if (!writable || !mDatabase.isReadOnly()) {
                // The database is already open for business.
                return mDatabase;
            }
        }
        ...
    }
可以看出如果mDataBase已经被打开过的话,会直接返回mDataBase对象,并没有判断数据库文件已经被删除的情况。

会发生此种现象的原因是ContentProvider运行在常驻进程中,有过一次数据库操作后mDataBase对象就会生成,后续如果有清除该程序数据的操作就会导致这个问题。至于为啥会清除数据那就是另外的问题了。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个SQLiteReadOnlyDatabaseException的问题 的相关文章

随机推荐

  • nvcc fatal : A single input file is required for a non-link phase when an outputfile is specified

    nvcc fatal A single input file is required for a non link phase when an outputfile is specified 错误原因 我想用VS编译colmap3 8 于是
  • Android无埋点数据收集SDK关键技术解析

    前言 本文基于网易乐得无埋点数据收集SDK 无埋点数据收集SDK用于向大数据平台提供全量 完整 准确的客户端数据 Android端无埋点数据收集SDK实现中涉及到比较关键的技术点有 用字节码插桩的方式实现Android端的AOP Hook
  • 自学python记录001-使用PyCharm创建项目

    启动PyCharm后如下所示 点击新建项目 选择项目存放路径 可以勾选创建main py文件 点击创建 创建完成后可以看到main py里面有一些提示的代码 比如说Shift F10可以运行项目 Ctrl F8可以直接添加断点 双击Shif
  • 强烈推荐的机器学习,深度学习课程以及python库

    本文知乎链接 强烈推荐的机器学习 深度学习课程以及python库 本着两条原则发一波车 1 不建议报辅导班 不是因为我们不应该为学习知识付费 而是因为有更好的资源 而这些资源恰好免费 报辅导班学习浪费钱倒是次要的 主要是时间有限 所以我们要
  • 程序分析技术理解(一)

    1 基本块 Basic Block 和流图 flow graph 将一段程序划分为基本块 Basic Block BB 每个基本块满足以下条件 a 控制流只能从基本块的第一个指令进入 b 除了基本块的最后一条指令 控制流在离开基本块前不会停
  • 移动端代码质量管理与安全检测评估

    在前面的文章中已经详细介绍过Jenkins Sonarqube的安装 配置及使用 对于Web端的代码质量管理通常相对容易 Jenkins配套Sonarqube很方便就能搞定 但是对于移动端来说 尤其iOS 集成和使用的复杂性会大幅提高 目前
  • PostgreSQL系列1:PostgreSQL 10.23 离线安装

    1 安装前准备 1 1创建用户 useradd postgres passwd postgres 1 2创建数据目录和日志目录 mkdir p data db pg data mkdir p data db pg logs chown R
  • 字符串分割(split),将字符串按照指定字符进行分割。split(String regex)和split(String regex, int limit)

    一 split String regex 字符串分割 将字符串按照指定字符进行分割 返回的是一个字符串数组 public String split String regex return split regex 0 原理 参数名称是rege
  • 【狂神说Java】HTML快速入门

    目录 1 初识HTML 2 网页基本信息 3 网页基本标签 4 图像标签 5 超链接标签应用 6 行内元素和块元素 7 列表标签 8 表格标签 9 媒体元素 10 页面结构分析 11 iframe内联框架 12 初始表单post和get提交
  • 两台linux文件拷贝

    scp就是secure copy 是用来进行远程文件拷贝的 数据传输使用ssh1 并且和ssh1使用相同的认证方式 提供相同的安全保证 与rcp不同的是 scp会要求你输入密码如果需要的话 最简单的应用如下 scp 本地用户名 IP地址 文
  • angular的ElementRef和Renderer2

    Angular ElementRef 简介 angular angular 2018 09 22 Angular 的口号是 一套框架 多种平台 同时适用手机与桌面 One framework Mobile desktop 即 Angular
  • opencv3.3.0在线读取网络图片图像资源

    说明 上一篇博客中描写了imread 的用法 请参见 http blog csdn net m0 37606112 article details 78524234 这一篇来描述cv2 videoCapture 的用法 照例打开opencv
  • vue插槽的基本使用

    1 什么是插槽 插槽 Slot 是 vue 为组件的封装者提供的能力 允许开发者在封装组件时 把不确定的 希望由用户指定的部分定义为插槽 2 体验插槽的基础用法 在封装组件时 可以通过元素定义插槽 从而为用户预留内容占位符 示例代码如下 如
  • 深度学习 - 模型的优化和过拟合问题

    优化函数 学习速率与反向传播算法 学习速率 learning rate 梯度就是表明损失函数相对参数的变化率 对梯度进行缩放的参数被称为学习速率 learning rate 学习速率是一种超参数或对模型的一种手工可配置的设置 需要为它指定正
  • 《Graph Neural Networks Foundations,Frontiers and Applications》第一部分第二章第2.3.1.1节翻译和解读

    书名 Graph Neural Networks Foundations Frontiers and Applications 图神经网络的基础 前沿和应用 出版社 Springer Berlin Heidelberg 作者 Lingfei
  • Python 函数的定义

    视频版教程 Python3零基础7天入门实战视频教程 函数 函数是执行特定任务的一段代码 程序通过将一段代码定义成函数 并为该函数指定一个函数名 这样即可在需要的时候多次调用这段代码 比如我们前面学到的range 函数 就是系统内置的函数
  • Appium自动化框架从0到1之 基类的封装

    这里只封装了4个基类 其他的大家可以自己丰富 直接上代码 baseView py coding utf 8 auth carl DJ time 2020 7 9 class BaseView object 封装一些基类 def init s
  • wazuh安装,单机部署3.13

    Wazuh涉及两个主要组件的安装 Wazuh服务器和Elastic Stack 此外 Wazuh agent需要部署到受监视的主机上 Wazuh server 运行Wazuh管理器和API 它从已部署的代理收集和分析数据 Elastic S
  • Java多线程基础

    原文链接 https blog csdn net weixin 43704599 article details 107379994 1 线程简介 1 1 多任务 现实中太多这样同时做多件事情的例子了 看起来是多个任务都在做 其实本质上我们
  • 一个SQLiteReadOnlyDatabaseException的问题

    最近测试同事上报了随机的一个crash问题 看日志是SQLiteReadOnlyDatabaseException的问题 发生在update数据库的时候 我自己写的ContentProvider代码就是在程序目录下放置数据 所以不是网上常见