即使卸载应用程序然后重新安装,Room也无法验证数据完整性

时间:2019-04-23 03:51:58

标签: android android-room data-integrity

我向现有数据库添加了一些新的实体(表)。因此在数据库配置中进行了配置-

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

从那时起,该应用程序处于开发阶段,我曾使用它来避免迁移。因此,我从设备上取消了该应用的安装,并通过Android Studio安装(运行)。但是它给出了以下错误-

  

房间无法验证数据完整性。看起来你变了   模式,但忘记更新版本号。您可以简单地解决   通过增加版本号。

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

android:allowBackup="false"
  

已编辑

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

更改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")...
                ... 

答案 2 :(得分:0)

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

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

它将为您完成“卸载”。

您可以参考this article here