解决:room无论如何怎么修改数据库版本都报错java.lang.IllegalStateException: Room cannot verify the data integrity

问题描述

这已经是第二次遇到这个bug了,第一次卡了一两天,这次卡了半天。
bug:

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you’ve changed schema but forgot to update the version number.
You can simply fix this by increasing the version number

因为在开发了一半时需要用到预填充的数据库,但是把room database类的版本改来改去都还是错,最后改得很混乱了。

前提

  1. 用的是预填充数据库
  2. 并且根据报错修改了版本号依旧报错
  3. 开启了export schema
  4. 不要在已发布的app上使用此方法,可能导致app更新后数据库版本对不上源代码所写的数据库版本!
  5. 不要在已发布的app上使用此方法,可能导致app更新后数据库版本对不上源代码所写的数据库版本!
  6. 不要在已发布的app上使用此方法,可能导致app更新后数据库版本对不上源代码所写的数据库版本!

解决

  1. 确定数据库和代码的entity和view索引一致(字段名主键外键…)

  2. 确定database类的版本号与预填充的版本号一致
    在这里插入图片描述
    2.1 修改sqlite数据库的用户版本号(即上述的版本号)方法:
    进入预填充数据库的目录下,在sqlite3命令行中:
    查看用户版本号:

    pragma user_version;
    

    更改用户版本号:

    pragma user_version = 你的版本号;
    

    在这里插入图片描述

  3. 用adb命令将旧app卸载干净(其实这里有个坑,如果用ui而不是命令行去clear storage或者clear cache再卸载其实卸载不干净,即使在AndroidManifest.xml中设置了backup=false,耗了很长时间发现用得还是某个旧数据库)
    在这里插入图片描述

  4. 在Database类中添加下图划线方法 (这一步不知道是否必须,我在修复这个bug的时候是这么写的)在这里插入图片描述

  5. 在schema文件夹中的最新json文件复制划线部分的hash值
    在这里插入图片描述
    在这里插入图片描述
    将hash值覆盖到预填充的数据库中的room_master_table表的identity_hash列中

  6. 启动app,并运行一个读取或写入数据库的方法,查看数据库发现没有报错,而且预填充数据库的数据被拷贝进了app,读取到了预填充数据库的数据。大功告成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值