【问题标题】:Room cannot verify data integraty of database built from asset with indicesRoom 无法验证由具有索引的资产构建的数据库的数据完整性
【发布时间】:2021-12-07 01:56:38
【问题描述】:

总结

我正在使用 createFromAsset() 预先填充数据库它可以工作,现在我需要向数据库添加索引,但是 Room 无法处理此更改。

速记

此数据库未投入生产,我在进行更改后重新安装了应用程序,我的问题不是如何从版本 X 迁移到 Y 的常见问题。

代码

这是我的实体

@Entity(tableName = "myTable", indices = [Index(value = ["col1","col2"], name = "myIndex")])
...

我运行了以下查询以将索引添加到预填充的数据库中

CREATE INDEX myIndex ON myTable (col1,col2)

进行这些更改后,我重新安装了应用程序以避免数据库版本问题。

问题是 Room 总是无法验证数据完整性,增加版本不是一个选项,如果(且仅当)我先安装版本 1 然后增加版本,它确实可以解决问题。

迁移也必须为空才能工作,执行以下查询失败,因为myIndex 已经存在:

db.execSQL("CREATE INDEX myIndex ON myTable (col1,col2)")

我尝试了什么

  • onCreate 函数中从 RoomDatabase.Callback() 本地运行查询,而不是直接从资产中导入。

想知道...

我似乎无法理解为什么 Room 抱怨索引,它拒绝添加它,因为它已经存在,运行空迁移解决了问题,不运行任何迁移会给我一个验证异常。

问题是我无法运行空迁移来修复它,因为迁移根本不会运行,因为该数据库尚未投入生产。

我感到迷茫。

【问题讨论】:

    标签: android android-room


    【解决方案1】:

    它拒绝添加它,因为它已经存在,

    使用CREATE INDEX IF NOT EXISTS myIndex ON myTable (col1,col2)

    您应该在onOpen 函数中使用它。

    或者,如果使用 Room 2.4.0-beta2 或更高版本,则有一个 prePackagedDatabase 回调,您可以使用它来执行相同的操作,但只有在复制预打包数据库时。

    1. 每次构建/打开数据库时都会调用onOpen 函数(这不是问题,因为现有索引将导致最小的开销)。

    2. 虽然 prePackagedDatabase 回调仅在从资产创建/复制数据库时调用。

    3. onCreate 函数仅在 Room 创建数据库时运行。使用 createFromAsset(或 File)时,它不会创建数据库。但是,如果您使用 fallbackToDestructiveMigration 并且没有覆盖 from/to 版本的迁移,则调用 onCreate

    正确的解决方案是将索引包含在预打包的数据库中,这样它就会一直存在。

    我似乎无法理解为什么 Room 抱怨索引,它拒绝添加它,因为它已经存在,运行空迁移解决了问题,不运行任何迁移会给我一个验证异常。

    如果您运行全新安装,则在实体中定义索引时,它将创建索引。因此它为什么已经存在(如果它已经存在,IF NOT EXISTS 不会创建它)。

    没有运行迁移会失败,因为房间会根据实体生成一个 identity_hash。更改实体,房间看到身份哈希已更改。

    您可能会发现查看生成的 java(从 Android Studio 中的 Android 视图可见)查找使用 @Database 注释但带有 _Impl 后缀的类的类,并在该类中查找 createAllTables 方法。这包括 Room 将创建的所有表和索引。

    您会看到 room_master 表,其中包含与包中的身份进行比较的身份哈希。您还会看到 Room 在所有 CREATE 语句中都包含 IF NOT EXISTS

    【讨论】:

    • 感谢您如此详细的回答!我现在可以工作了:) 我已经在我的预打包数据库中包含了索引,我所做的是从实体中删除索引这样做解决了问题,我认为我必须在实体中添加索引去工作。但看起来我错了,它现在正在工作,在 col1 和 col2 中插入重复的值失败了
    猜你喜欢
    • 2017-10-27
    • 2017-11-16
    • 2021-08-07
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多