identityHash不匹配导致房间数据完整性错误如何解决?

How to solve room data integrity error due to identityHash mismatch?

问题: 每当我对数据库或模型进行更改时,我都会收到以下 Room 数据完整性错误:

我的理解是我不需要增加版本号,因为我正在使用 .fallbackToDestructiveMigration()。

背景:

文件:RoomDB.java

@Database(entities =
    {Note.class, Label.class, Join_ScheduleLabel.class, Schedule.class},
    version = 1)
@TypeConverters(DataConverters.class)
public abstract class RoomDB extends androidx.room.RoomDatabase {

    public static final String DATABASE_NAME = "vk_prepop.sqlite";

    private static RoomDB INSTANCE;

    public static RoomDB getInstance(final Context context) {
        if (INSTANCE == null) {
            synchronized (RoomDB.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(
                        context.getApplicationContext(),
                        RoomDB.class,
                        DATABASE_NAME)
                        // Source: https://developer.android.com/training/data-storage/room/prepopulate
                        .createFromAsset(DATABASE_NAME)
                        // Todo: Remove Destructive Migration
                        // Wipes and rebuilds instead of migrating if no Migration object.
                        .fallbackToDestructiveMigration()
                        .build();
                }
            }
        }
        return INSTANCE;
    } 
    public abstract RoomDao getRoomDao();
}

已采取的故障排除步骤:

  1. 验证 RoomDB.java 文件的实体与模型和数据库匹配。
  2. 进入“应用信息”并点击“清除数据”()。
  3. 正在卸载应用程序。
  4. 正在清单中进行设置 android:allowBackup="false" ()。

可能的解决方案: 回答中,他说可能存在 identityHash 不匹配,但我不确定如何使用 DB Browser for SQLite 解决此问题。

回答指出可能存在 identityHash 不匹配。的确如此。以下是我使用 DB Browser for SQLite (v3.12.0) 解决问题的方法。

第 1 步: 在 Android Studio 的项目面板中选择“项目”视图:

第 2 步: 然后双击您的架构的 json 文件:

步骤 3: 复制此 json 文件中的 identityHash:

第 4 步: 在 DB Browser for SQLite 中打开您的数据库。单击“浏览数据”选项卡。然后从下拉菜单中选择“room_master_table”。

第 5 步: 将 Android Studio 中 json 文件中的 identityHash 与 DB Browser for SQLite 中的 identityHash 进行比较。如果哈希值不同,这可能是导致房间数据完整性错误的原因。

第 6 步: 因此,将 Android Studio 的 json 文件中的 identityHash 粘贴到 DB Browser for SQLite 的 identityHash 单元格中。

第7步:然后按Ctrl+Shift+S保存数据库

步骤 8:单击“关闭数据库”。

第 9 步: 在 phone 或模拟器上的应用程序中,转到“应用程序信息”->“存储" -> "清除数据".

第 10 步: 然后在 Android Studio 中按“运行 app”。

问题解决了……至少对我来说是这样。如果这些步骤没有帮助,请查看这些额外的

My understanding is that I shouldn't need to increase the version number since I am using .fallbackToDestructiveMigration().

如果需要迁移并且没有涵盖迁移的迁移,则 fallBackToDestructiveMigration 仅 运行s。

在您的情况下,问题是您在预打包数据库中包含了 room_master_table,因此 identity_hash 列可用于比较(如果对影响空间如何从模式生成 identity_hash 的模式进行更改,这将是不正确的)。

通过包含 room_master_table,您引入了不必要的复杂性。

如果您从预打包的数据库中省略这个 table,那么它会被创建并填充,当它是从资产创建(即当数据库不存在时)。因此,您只需对资产(预打包的数据库)进行适当的更改,删除当前数据库(例如卸载应用程序或清除应用程序数据),然后运行应用程序。