当前位置: 首页 > 知识库问答 >
问题:

Room无法验证数据完整性。我如何在不编写迁移步骤的情况下修复它?

弘靖琪
2023-03-14

在交付到生产构建之前,我已经确保了以下几点

  1. 增加数据库版本
  2. @database注释行中有 exportschema=false
  3. allowBackup在清单中变为false
  4. 创建数据库时有.fallbacktoDestructiveMigration()
  5. 创建数据库时有.fallbacktoDestructiveMigrationonDowngrade()
  6. 创建数据库时有.EnableMultiInstanceInvalidation()

应用程序崩溃,出现以下StackTrace。

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.
Fatal Exception: java.lang.RuntimeException: Exception while computing database live data.
   at androidx.room.RoomTrackingLiveData$1.run + 92(RoomTrackingLiveData.java:92)
   at java.util.concurrent.ThreadPoolExecutor.runWorker + 1167(ThreadPoolExecutor.java:1167)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
   at java.lang.Thread.run + 764(Thread.java:764)
Caused by java.lang.IllegalStateException: A migration from 19 to 20 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
   at androidx.room.RoomOpenHelper.onUpgrade + 101(RoomOpenHelper.java:101)
   at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.onUpgrade + 124(FrameworkSQLiteOpenHelper.java:124)
   at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked + 398(SQLiteOpenHelper.java:398)
   at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase + 298(SQLiteOpenHelper.java:298)
   at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper$OpenHelper.getWritableSupportDatabase + 92(FrameworkSQLiteOpenHelper.java:92)
   at androidx.sqlite.db.framework.FrameworkSQLiteOpenHelper.getWritableDatabase + 53(FrameworkSQLiteOpenHelper.java:53)
   at androidx.room.RoomDatabase.inTransaction + 452(RoomDatabase.java:452)
   at androidx.room.RoomDatabase.assertNotSuspendingTransaction + 275(RoomDatabase.java:275)
   at androidx.room.RoomDatabase.query + 304(RoomDatabase.java:304)
   at androidx.room.util.DBUtil.query + 54(DBUtil.java:54)
   at com.xxx.data.local.banner.BannerDao_Impl$4.call + 218(BannerDao_Impl.java:218)
   at com.xxx.data.local.banner.BannerDao_Impl$4.call + 215(BannerDao_Impl.java:215)
   at androidx.room.RoomTrackingLiveData$1.run + 90(RoomTrackingLiveData.java:90)
   at java.util.concurrent.ThreadPoolExecutor.runWorker + 1167(ThreadPoolExecutor.java:1167)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
   at java.lang.Thread.run + 764(Thread.java:764)

共有1个答案

经福
2023-03-14

我用下面的方法解决了房间迁移问题。

 Room.databaseBuilder(context, AppDatabase::class.java, "xxx.db")
        .fallbackToDestructiveMigration()
        .fallbackToDestructiveMigrationOnDowngrade()
        .fallbackToDestructiveMigrationFrom(16, 17, 18, 19)
        .build() 

必须添加fallbacktoDestructiveMigrationFrom()方法,该方法强制删除表并用新模式重新创建表。

因此,db版本的varargs(例如16、17、18、19)将为方法FallbacktoDestructiveMigrationFrom(...)的这些版本号重新创建db

 类似资料:
  • 我正在创建我的第一个房间SQLite迁移,我不知道我现在应该做什么,旧数据库中的版本号是2,我正在将其更改为3。当我尝试编译应用程序时,控制台中出现以下错误: 我的数据库代码如下所示: 当我在编写迁移代码时,我得到了“迁移没有正确处理”,直到我修复了所有这些,之后我开始得到数据完整性错误。 提前谢了。

  • 我正在尝试在没有项目编写器的情况下使用下面的配置来配置spring批处理步骤。然而,我错误地说writer元素既没有'writer'属性,也没有元素。 我浏览了链接spring批处理:没有ItemWriter的Tasklet。但无法解决问题。有人能告诉我在我提到的代码片段中要做的具体更改吗

  • 我们有一个数据库,其中有一个名为Students的表,其中包含id、name、age和school列。 现在我想编写一个迁移脚本,将3列(假设我有数百万条记录)从Students表复制到New_Students表。 下面是我编写的示例脚本。这是一个错误 当在crateDb管理UI中执行上面的命令时,我得到下面的错误 以上语句在单独执行时有效。 问题: 为什么上面的多个语句不起作用,但是当单独键入时

  • 问题内容: 有没有办法在不使用Java代码的情况下在H2中编写函数?我的要求是在不使用Java代码的情况下将用SQL编写的函数转换为H2。我在不同的门户网站中找到了许多使用Java代码执行相同操作的示例。对你的帮助表示感谢。 问题答案: 当前,H2仅支持以Java或相关语言(例如Groovy或Scala)编写的功能。不支持PL / SQL(Oracle) 和T-SQL(MS SQL Server,

  • 问题内容: 当我打印一个numpy数组时,我得到了一个截断的表示形式,但是我想要完整的数组。 有什么办法吗? 例子: 问题答案: 用途

  • 自那时起,该应用程序处于开发阶段,我使用该应用程序来避免迁移。所以我已经从设备中配置了应用程序,并通过Android Studio安装(运行)。但它的给出跟随错误- Room无法验证数据完整性。看起来您已经更改了架构,但忘记更新版本号。您可以简单地通过增加版本号来解决这个问题。 在我的清单中,allowBackup设置为false,如下所示- 已编辑 我有一件事要提。我在资产文件夹中有一个sqli