sqlite 空间无法验证数据完整性,如何在不编写迁移步骤的情况下修复它?[duplicate]

qlfbtfca  于 2023-03-03  发布在  SQLite
关注(0)|答案(1)|浏览(131)
    • 此问题在此处已有答案**:

(21个答案)
6天前关闭。
我在生产应用程序上设置了房间。我对应用程序中的多个表进行了许多架构相关的更改。
在交付生产构建之前,我已确保以下内容
1.增加数据库版本
1.在@Database注解行中包含exportSchema = false
1.在清单<application android:allowBackup="false" />中允许备份为false
1.创建数据库时使用.fallbackToDestructiveMigration()
1.创建数据库时使用.fallbackToDestructiveMigrationOnDowngrade()
1.创建数据库时使用.enableMultiInstanceInvalidation()
应用程序崩溃,堆栈跟踪如下。

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.

对于开发,我可以清除应用缓存和数据,但如何在生产中修复此问题?我不希望编写迁移步骤,因为架构和表中有多个更改。
我读过excellent article,但没有什么帮助。我有什么选择?
堆栈跟踪

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)
d8tt03nd

d8tt03nd1#

我使用以下方法解决了房间迁移问题。

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

必须添加fallbackToDestructiveMigrationFrom()方法,该方法强制删除表并使用新模式重新创建表。
因此,db版本(例如16, 17, 18, 19)的varargs将为方法fallbackToDestructiveMigrationFrom(...)的这些版本号重新创建db
不知道为什么这个方法工作,但fallbackToDestructiveMigration()不工作。
为什么这么奇怪?

相关问题