问题描述

这已经是第二次遇到这个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,读取到了预填充数据库的数据。大功告成!