【问题标题】:Room cannot verify the data integrity, even after uninstalling app then re-installingRoom 无法验证数据完整性,即使在卸载应用程序然后重新安装后也是如此
【发布时间】:2019-09-12 05:12:30
【问题描述】:

我在现有数据库中添加了一些新的实体(表)。所以在数据库配置中配置了那些-

@Database(entities = {existingTable1.class, existingTable2.class, existingTable3.class, existingTable4.class,
        newTable1.class, newTable2.class
        }, version = 1, exportSchema = false)

由于该应用程序处于开发阶段,我曾经避免迁移。所以我从设备上卸载了应用程序并通过 Android Studio (Run) 安装。但是它给出了以下错误-

Room 无法验证数据完整性。看起来你变了 架构但忘记更新版本号。你可以简单地修复 这可以通过增加版本号来实现。

在我的清单中,allowBackup 设置为 false,如下所示-

android:allowBackup="false"

已编辑

我要提一件事。我在资产文件夹中有一个 sqlite 数据库文件。我只是在安装时将其复制到相应的 app DB 文件夹中。因此,当需要添加包含大量预填充数据的新表时,我只需更新资产文件夹中的 sqlite 数据库文件,然后调整相关实体并构建/运行项目。这样,它工作正常,但这次它产生了这个问题。

【问题讨论】:

  • 在设置android:allowBackup="false" 后你是否至少运行过一次?
  • 确保清除数据和缓存
  • @ManoharReddy,是的。但是从设备安装后,为什么需要这种迁移:O
  • @Sadat 打开应用设置,手动清除数据并检查一次。
  • @ManoharReddy,哪个“应用程序设置”?你能具体说明吗?

标签: android android-room data-integrity


【解决方案1】:

如果您不需要保存数据并且不关心它们,只想告诉 Room 您正在迁移,您可以像这样使用.fallbackToDestructiveMigration()

database = Room.databaseBuilder(context.getApplicationContext(),
                        UsersDatabase.class, "Sample.db")
                .fallbackToDestructiveMigration()
                .build();

它会为你“卸载”。

可以参考this article here

【讨论】:

  • 我这样做了,但我仍然收到错误发生了什么
  • 增加房间版本。请使用调试向我们展示堆栈跟踪
  • 我在一个名为 integers.xml 的文件中使用了整数资源,例如 R.integer.databaseVersion,这就是问题所在。现在我正在直接编写整数,它正在工作。
【解决方案2】:

如果您在 APK 中预打包数据库。然后从中删除“room_master_table”。 你可以SQLborwser为它。

【讨论】:

    【解决方案3】:

    当您更改 Room 数据库结构时,您应该创建一种更新现有数据库的方法。如果第一个结构是版本 1,则第二个结构应该是版本 2。 但是 Room 需要一种将现有数据库更新为新结构的方法。 您应该创建一个迁移函数。

    static RoomDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (RoomDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            RoomDatabase.class, "your_database")
                            .addMigrations(MIGRATION_1_2)
                            .build();                
                }
            }
        }
        return INSTANCE;
    }
    
    private static final Migration MIGRATION_1_2 = new Migration(1, 2) {
        @Override
        public void migrate(SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE IF NOT EXISTS new_table...
        }
    };
    

    如果您只想从头开始而不更新当前数据库,则可以将其删除以强制创建数据库。

        static RoomDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (RoomDatabase.class) {
                if (INSTANCE == null) {
                    // do not forget to remove this line if it is not needed 
                    context.getApplicationContext().deleteDatabase("your_database");
                    // Create database here 
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                            RoomDatabase.class, "your_database")...
                    ... 
    

    【讨论】:

    • 我已经尝试过您的第二个解决方案,但它只会使数据库条目为空。我已经编辑了我的问题,请看一下。
    • 那么,当您将数据库替换为资产文件夹中的数据库时,问题仍然存在吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2014-09-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 2016-03-08
    • 2017-11-16
    相关资源
    最近更新 更多