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

Posted 学疯了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决: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,读取到了预填充数据库的数据。大功告成!

以上是关于解决:room无论如何怎么修改数据库版本都报错java.lang.IllegalStateException: Room cannot verify the data integrity的主要内容,如果未能解决你的问题,请参考以下文章

呼呼!又报错?突然就蒙了!读写分离客户端远程登录amoeba进入数据库,正常登入后,执行语句都报错,怎么盘?

npm run build 打包命令报错,npm i -g npm 后使用任何跟npm相关的命令都报错 的解决方案

NFS挂载报错

maven报错,怎么解决,我是新手。

pip安装(install)任何package(扩展库)都报错status = self.run(options, args)...check_hostname requires serve的解决方法

HBuilder运行-手机运行报错,怎么解决?