android 房间数据库模型意外更改

ffx8fchx  于 2023-03-27  发布在  Android
关注(0)|答案(1)|浏览(307)

出于某种原因,我开始得到这个错误:

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实体。
我导出了更改前后的数据库,我注意到其中一个实体的这一列

...`created_at` TEXT,...

改为

...`created_at` TEXT NOT NULL,...

我从来没有对它做过任何事情。这不是什么大不了的事,我可以做一个迁移,也许解决它,但我仍然想找出它的根本原因,谁知道还有什么可能受到影响。
我能做些什么来让它自动更新模型呢?
我做了些事,希望能缩小范围:

  • 将KMM模块集成到现有的Android项目中
  • 更新的firebase-crashlytics
  • 已将项目级别(非应用级别)build.gradle转换为Kotlin,因此build.gradle.kts
  • gradle-wrapper.propertiesdistributionUrl6.6.1增加到7.3.3
  • classpath com.android.tools.build:gradle4.0.1增加到7.2.2
  • Kotlin版本从1.6.21增加到1.8.0
  • com.google.gms:google-services2.2.1增加到2.9.4

在我看来,这些事情都不应该影响我的数据库模型...但显然有些事情影响了。
有什么主意吗?

编辑

我只是注意到,在2次迁移之前的某个时候(所以不会很快),我这样做了

database.execSQL("ALTER TABLE `GridItem` ADD COLUMN `created_at` TEXT NOT NULL DEFAULT ''");

看起来我确实将其定义为NOT NULL,但是后来...为什么在我导出数据库时,它现在只是说TEXT,而实际上我之前将其定义为NOT NULL?!这太令人困惑了!

lrpiutwd

lrpiutwd1#

我能做些什么来让它自动更新模型呢?
我导出了更改前后的数据库,我注意到其中一个实体的这一列
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根据Room如何解释@Entity注解的类来创建模式的散列。
当在运行时打开/连接数据库时,如果数据库存在,则将编译的哈希值与存储在room_master_table中的哈希值进行比较,如果两个哈希值不匹配,则Room希望版本号增加。如果版本没有增加,则会收到Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. ....消息和异常。
通过导出数据库,您将维护导出时的哈希。
NOT NULL是模式的一部分,因此任何更改状态的更改都将影响模式,从而影响哈希。

  • NOT NULL是在检查@Entity注解类时根据Room的一组规则确定的。这些规则相当复杂,因为有潜在的因素,例如考虑到主键(尽管SQLite允许null,但Room不允许为null)。Room考虑隐式和显式因素。
  • 确定什么是什么的最简单方法是引用生成的java并检查类中的createAllTabales方法,该方法与@Database注解类同名,但后缀为**_Impl**(也可以在其中找到哈希)。

相关问题