相关文章推荐
没有腹肌的沙滩裤  ·  FineBI高级表达式与脚本编写的技术指南 ...·  1 年前    · 
干练的面包  ·  被漫画行业抛弃的《幽冥诡匠》,居然还活着·  1 年前    · 
想发财的遥控器  ·  搜索-阜阳市颍泉区人民政府·  2 年前    · 
奔放的打火机  ·  特斯拉业绩会要点:优先考虑销量增长而非利润 ...·  2 年前    · 
安静的海龟  ·  爆笑萌妃:王妃你该吃药了(乐颜)最新章节全文 ...·  2 年前    · 
Code  ›  Android第十九课 attempt to write a readonly database解决-天翼云
云主机 天翼云 sqlite 天翼
https://www.ctyun.cn/zhishi/p-159579
干练的硬币
2 年前

最新活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
查看全部活动
热门活动
  • 算力升级·智赢未来 NEW 爆款云主机畅享3个月仅47元起!
  • 云上钜惠 HOT 限制抢购 爆款云主机畅享3个月只要33元起!
  • 中小企业上云场景组合购 NEW 建站、域名等场景一站式购齐,组合购9元起!
  • 天翼云·创新直播间 NEW 与专家共同解读云计算领域前沿趋势
  • 新客特惠 NEW 热销云主机秒杀低至0.85折!
  • 天翼云电脑专场 HOT 移动办公神器天翼云电脑4核8G畅享3个月只要130元起!
  • 云主机特惠 HOT 新老同享云主机2.5折起,升级高性能云主机更划算!
免费活动
  • 企业免费试用专区 HOT 数十款产品免费试用,完成企业实名认证领取2000元试用金!
  • 个人免费试用专区 HOT 完成个人实名认证即可获得1000元试用金!
  • 新客特惠 爆款云主机0.85折起
  • 云上安全专场 安全产品全场6折起!

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务。
进入甄选商城 进入云市场
办公协同
  • WPS云文档天翼云版 翼企云( License版) 天翼云企业云盘(标准服务版) 蓝信安全移动工作平台(SAAS) SSL证书 新域名服务 税务风控云 商企云财税(SAAS版) 翼云加速-标准版包月套餐 天翼云管家2.0 天翼云管家 翼备份(SaaS版)300G 智慧工厂_生产流程管理解决方案 天翼智慧工地 天翼全栈混合云敏捷版(软件) 天翼全栈混合云敏捷版(一体机)

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云技术合作伙伴
  • 天翼云OpenAPI中心 天翼云诸葛AI平台 天翼云EasyCoding平台
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云培训认证
  • 天翼云学堂 天翼云市场商学院
天翼云服务合作伙伴
  • 天翼云MSP合作伙伴
天翼云合作计划
  • 央企云合作计划
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴 天翼云甄选商城合作伙伴

开发者

开发者相关功能入口汇聚
技术社区
资源与工具
  • 天翼云OpenAPI EasyCoding敏捷开发平台 AI创作间
培训与认证
  • 天翼云学堂 天翼云认证

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • OpenAPI中心 客户支持计划

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云 天翼云4.0 天翼云APP 全球基础设施 分析师和白皮书 2023云生态大会 2022云生态大会 天翼云中国行 支持与服务 了解天翼云
    • 弹性云主机
    • 天翼云电脑(公众版)
    • 对象存储
    搜索发现
    弹性云主机 天翼云电脑(公众版) 对象存储 云硬盘 云间高速 云专线CDA 服务器安全卫士 云堡垒机 关系数据库MySQL版 关系数据库PostgreSQL版
  • 站点切换
    • 中国站
  • 文档
  • 控制中心
  • 备案中心
  • 管理中心

Android第十九课 attempt to write a readonly database解决

首页 知识中心 其他 文章详情页

Android第十九课 attempt to write a readonly database解决

2023-3-16 阅读次数:32

SQLite, Android

场景
Jni下编译SQLite源码作为数据库,在测试手机:型号(Redmi Note 2) Android版本(5.0.2 LRX22G)系统下使用,尝试写数据库的时候,返回错误信息:attempt to write a readonly database

原因
SQLite源码定义的存储节点编号数据类型由于类型长度不足以描述真实的存储节点数据类型,导致在对比存储节点长度的时候,出现截断的问题,从而引发只读数据库问题

解决
在sqlite.c文件中查找
ino_t ino; /* Inode number */
修改为
unsigned long long ino; /* Inode number */

错误说明
Store inodes in unsigned long long In 32 bit ABIs, ino_t is a 32 bit type, while the st_ino field in struct stat is 64 bits wide in both 32 and 64 bit processes. This means that struct stat can expose inode numbers that are truncated when stored in an ino_t. The SDCard fuse daemon (/system/bin/sdcard) uses raw pointer values as inode numbers, so on 64 bit devices, we're very likely to observe inodes that need > 32 bits to represent. The fileHasMoved function in sqlite compares the stored inode value with a new one from stat, and when the stored value is truncated, this check will falsely indicate that the file has been moved. When the fileHasMoved function triggers, other functions start returning errors indicating that the database is in read-only mode. NOTE: Bionic differs from glibc in that struct stat's st_ino is *always* 64 bits wide, and not the same width as ino_t.

32位应用程序二进制接口使用unsigned long long存储磁盘节点,ino_t是32位比特数据类型,在结构体stat字段st_ino在32位还是64位处理器都是64比特长度。这意味着结构体stat能够完整描述节点编号,但是ino_t存储节点由于长度问题,会导致截断的情况。SDCard守护进程(/system/bin/sdcard)使用原始指针值作为节点编号,所以在64比特设备,我们需要大于32比特的数据类型描述节点sqlite源码中的fileHasMoved函数对比从stat获取的值跟存储的节点值,如果存储的节点值被截断,检测就会失败,返回的值说明文件已经被移除。当fileHasMoved函数触发的时候,其他函数开始返回错误,提示数据库处于只读状态。
注意:Bionic库不同于glibc库,结构体stat中st_ino字段是64比特长度跟ino_t不是同一个长度类型


参考
http://www.jianshu.com/p/30139ef31230

解决过程:
1 怀疑是读写权限的问题,但是其他文件也有读写,明显不成立,并且已经提供了读写的权限:
<uses-permission android:name="android.permission.INTERNET" />

2 怀疑是使用MTP模式共享机身存储到电脑,导致两边同时编辑,通过关闭MTP媒体共享,不成立
Redmi Note 2手机请勿关闭MTP媒体设备,否则需要恢复出厂设置才能够重新共享到电脑。

3 拷贝test.db和test.db-journal文件到Windows系统,并且使用SQLite控制台进行修改,没有任何的
问题。当前使用的是相同的SQLite源码编译的控制台程序。进行数据的插入过程中,会自动删除journal归档文件,并没有提示只读。另外单独拷贝test.db,直接操作,也没有任何的问题。

4 尝试关闭Java层对数据库的读写访问,只是允许NDK层直接操作数据库,防止多线程访问数据库,还是出现同样的结果,当然不知道是否是sqlite3_open与sqlite3_open_v2的接口是否会产生不同的结果,目前采用第一种方法访问数据库。

5 尝试获取Android系统中SQLite的版本,调用getVersion返回1,没有实质上的帮助。

6 是否是其他的Java层获取数据库的连接,没有关闭导致问题的出现?SQliteOpenHelper内部只缓存一个数据库的连接,在多线程的使用过程中,不要频繁的调用close,而应该保存一个唯一的一个访问实例,但是对于多进程之间的访问,也带来问题http://blog.sina.com.cn/s/blog_5de73d0b0102w0g0.html


7 虽然NDK无法修改数据,但是可以读取数据,而Java层却可以轻松的完成数据库的修改操作。

8 尝试调用beginTransaction和endTransaction对数据库的操作进行事务加锁还是没有任何的效果

9 怀疑是Android目录的读取问题,NDK层的SQLite读取数据库文件,发现有问题,但是没有办法找到journal归档文件,因此认为是只读,也是合理的
总结
经过上述种种的研究分析,得到如下的猜测:NDK层的SQLite实例在系统开机启动之后,会检查是否存在journal档案。如果是通过程序自动删除该journal档案。但是如果程序无法自动删除,目前怀疑就是因为版本之间的不对称,导致无法删除journal,SQLite数据库因此数据库变成只读的状态。

折中方案
NDK层只是负责只读数据,如果有任何的修改,都需要调用Java的接口进行修改数据,虽然有SQLite的源码,但是NDK层不好调试。

版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/fengyuzaitu/2296310,作者:fengyuzaitu,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

上一篇: Percona-tookit学习笔记(一)

下一篇: 初识IndexedDB【改,删】下

相关文章

2023-5-5

C# SQLite数据库 访问封装类

在客户端配置文件<configuration>节点下,添加:其中【localdb】是本地SQLite数据库的名称,【conf

SQLite
2023-3-22

Android第十一课 Android.mk文件以及Application.mk文件

Application.mk文件中在相关的博客中说不允许APP_MODULES是一个带空格的模块列表,例如:APP_MODULES := zlib sqlite正确的写法应该是APP_MODULES:= zlib sqlite测试没有任何的

Android
2023-3-22

SQLite第四课 sqlite3_set_authorizer使用例子

例子说明 可以将一个如下面格式的my_authorizer函数,注册到SQLite语句的解释执行语句当中,并且最先被执行,就像是一个钩子,对sql语句进行一些访问的控制,类似于网络数据包的netfilter。代码#include <i

SQLite
2023-3-22

Android第十四课 Jni函数调用异常获取错误信息

场景说明: Android平台NDK调用iconv_open函数,实现UTF-8转GBK编码,没有达到预期的效果。尝试获取iconv_open函数失败的错误码。因为NDK的运行环境是Linux系统,所以尝试使用Linux获取错误

Android
2023-3-22

Android第十三课 Java与C++之间基本数据传递

说明    在使用NDK编程中,避免不了在Java 和C++之间传递数据,在两种语言之间,jint,jlong,jfloat作为基本类型的桥梁。从C++传递数据给Java如果传递的是整型,完全没有问题,但是如果传递的过程中Java的接口是l

Android
2023-3-22

Android第二十四课 Jni 读写sd卡报异常错误

场景    红米Android5.0系统测试结果发现不支持写sd卡,因此通过Jni的方式访问sd卡的内容,在写数据的时候会出错。暂时没有解决方案,不过却可以在存储卡中进行读写。测试代码#include <errno.h>#inc

Android
2023-3-22

Android第二十五课 native程序异常crash 定位

Android程序崩溃退出的时候,会将崩溃的堆栈信息保存在/data/tombstones目录下。该目录需要ROOT权限才能够访问。所以为了访问该路径,手机必须先ROOT破解。jni或者java代码崩溃的信息都被记录。该

Android
2023-4-19

Android 开发————12、Service

Service分类:Service从本质上可以分为两种类型:Started(启动):当应用程序组件(如:Activity)通过调用

Android Service
2023-4-16

Android解压缩ZIP / GZIP数据(基于InflaterInputStream实现)

在实际的项目代码使用过程中,发现如果用Java类库标准指定的GZIPInputStream读取压缩数据解压不能稳定工作,原因不明。反而使

Android
2023-4-16

Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘闪现灰白色水波纹动画

Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘

Android ListView RecyclerView

作者介绍

天翼云小翼
天翼云用户

文章

11962

阅读量

261253

查看更多

最新文章

Android第十一课 Android.mk文件以及Application.mk文件

2023-3-22

SQLite第四课 sqlite3_set_authorizer使用例子

2023-3-22

Android第十四课 Jni函数调用异常获取错误信息

2023-3-22

Android第二十四课 Jni 读写sd卡报异常错误

2023-3-22

Android取消RecyclerView、ListView、ScrollView、HorizontalScrollView滑动到边缘闪现灰白色水波纹动画

2023-4-16

Android Glide加载四周圆角图

2023-4-16

查看更多

热门文章

Android Glide加载四周圆角图

2023-4-16

Android第十五课 Jni自带的iconv库不支持GBK转码

2023-3-16

Android第十七课 Jni string空串跨模块使用崩溃注意事项

2023-3-16

Android第六课 安装异常处理

2023-3-7

SQLite第二课 下载编译

2023-3-7

Android第四课 adb常用指令

2023-3-7

查看更多

热门标签

python linux javascript docker android kubernetes leetcode django Android elementui
查看更多

相关产品

弹性云主机

随时自助获取、弹性伸缩的云服务器资源

天翼云电脑(公众版)

便捷、安全、高效的云电脑服务

对象存储

高品质、低成本的云上存储服务

云硬盘

为云上计算资源提供持久性块存储

查看更多

随机文章

Android第十一课 Android.mk文件以及Application.mk文件

Android两条并排RecyclerView实时联动滑动增强

Android中的MVP设计架构

Android查看apk签名信息

Android官方dip值到pix值转换:dip2pix,dip2px,dp2px实现

SQLite第四课 sqlite3_set_authorizer使用例子

推荐助力领好礼 邀请好友完成推荐任务 最高可得千元电信卡
查看详情
  • 7*24小时售后
  • 无忧退款
  • 免费备案
  • 专家服务
售前咨询热线
400-810-9889转1
  • 天翼云APP 微信公众号
服务与支持
  • 备案中心
  • 售前咨询
  • 智能客服
  • 自助服务
  • 工单管理
  • 客户公告
账户管理
  • 管理中心
  • 订单管理
  • 余额管理
  • 发票管理
  • 充值汇款
  • 续费管理
快速入口
  • 文档中心
  • 最新活动
  • 免费试用
  • 安全专区
  • 信任中心
  • 天翼云学堂
云网生态
  • 甄选商城
  • 渠道合作
  • 云市场合作
了解天翼云
  • 关于天翼云
  • 天翼云APP
  • 服务案例
  • 新闻资讯
  • 联系我们
  • 校园招聘
热门产品
  • 弹性云主机
  • 天翼云桌面
  • 天翼云电脑
  • 天翼云手机
  • 关系型数据库
  • 对象存储
  • 云硬盘
  • Web应用防火墙
  • 服务器安全卫士
  • 天翼云办公
热门推荐
  • 云服务备份
  • 云空间
  • 全站加速
  • 安全加速
  • 超融合服务-iStack
  • 智能边缘云
  • 应用编排服务
  • 微服务引擎
  • 共享流量包
更多推荐
  • web应用防火墙
  • 密钥管理
  • 等保咨询
  • 安全专区
  • 应用运维管理
  • 云日志服务
  • 云网融合
  • 云搜索服务
  • 数据湖探索
  • 数据仓库服务
友情链接
  • 天翼云盘
  • 天翼企业云盘
  • 189邮箱
  • 中国电信集团
©2023 京ICP备 2021034386号
 
推荐文章
没有腹肌的沙滩裤  ·  FineBI高级表达式与脚本编写的技术指南 - CSDN文库
1 年前
干练的面包  ·  被漫画行业抛弃的《幽冥诡匠》,居然还活着
1 年前
想发财的遥控器  ·  搜索-阜阳市颍泉区人民政府
2 年前
奔放的打火机  ·  特斯拉业绩会要点:优先考虑销量增长而非利润 Cybertruck会在Q3交付_手机新浪网
2 年前
安静的海龟  ·  爆笑萌妃:王妃你该吃药了(乐颜)最新章节全文无弹窗在线阅读-QQ阅读男生网
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号