【问题标题】:How to solve room data integrity error due to identityHash mismatch?如何解决由于identityHash不匹配导致的房间数据完整性错误?
【发布时间】:2022-01-02 17:16:10
【问题描述】:

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

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

背景:

  • 我使用 DB Browser for SQLite (v3.12.0) 对数据库进行更改。
  • 我经常对仍在开发中的应用程序/数据库进行更改。所以,我使用的是 .fallbackToDestructiveMigration() (see codelab example)。

文件: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. 进入应用信息并点击“清除数据”(see SO answer)。
  3. 正在卸载应用程序。
  4. 在清单 (see SO answer) 中设置 android:allowBackup="false"

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

【问题讨论】:

    标签: sqlite android-room


    【解决方案1】:

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

    fallBackToDestructiveMigration 仅在需要迁移且没有 Migration 覆盖迁移时运行。

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

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

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

    【讨论】:

      【解决方案2】:

      live-love's 回答指出可能存在身份哈希不匹配。确实是这样。以下是我使用 DB Browser for SQLite (v3.12.0) 解决问题的方法。

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

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

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

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

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

      第 6 步: 因此,将 Android Studio 的 json 文件中的 identityHash 粘贴到 SQLite 数据库浏览器中的 identityHash 单元格中。

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

      第 8 步:点击“关闭数据库”。

      第 9 步:在手机或模拟器上的应用中,转到“应用信息”->“存储”->“清除数据”。

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

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

      【讨论】:

        猜你喜欢
        • 2018-09-11
        • 1970-01-01
        • 2018-05-15
        • 2019-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-23
        • 2014-08-26
        相关资源
        最近更新 更多