【发布时间】:2019-08-18 18:07:19
【问题描述】:
我的目标是使用 Room 的新 createFromAsset api 从应用资产加载预加载的数据库。但是,我注意到如果我的预加载数据库在room_master_table 中没有有机(由 Room 生成)ID 和身份哈希,我会收到“IllegalStateException:Room 无法验证数据完整性”。抛出异常。
我尝试使用 Room 生成的精确 db 文件作为它复制的预加载 db 并且这可以工作,但我不知道为什么。这些数据库版本/id/哈希似乎保存在某个地方,Room 会根据这些版本对其进行验证。但是我已经尝试删除本地数据库并卸载应用程序,但仍然抛出相同的异常。
我想知道 room 如何在 room_master_table 中生成特定的 id 和 hash 以及如何验证它们?
【问题讨论】:
-
我建议你不要在你的预包数据库中包含
room_master_table。第一次打开数据库时,Room 将验证模式并创建主表以及哈希值(如果一切正常)。如果您包含room_master_table,那么看起来好像数据库已经被 Room 打开了,在这种情况下,Room 只会比较哈希而不是进行更合适的模式检查。 -
@DanyBoricua 不正确。无论您是否提供
room_master_table房间都会做同样的事情。它始终调用SELECT identity_hash FROM room_master_table,与您是否提供room_master_table无关。然后它将返回值(null,如果不存在)与编译后的哈希值进行比较。 -
@musooff,这不是我基于 Room 的 OpenHelper(检查主表)的理解。见:android.googlesource.com/platform/frameworks/support/+/…
-
@DanyBoricua 正如您从源代码中指出的那样。它检查
identity_has内的room_master_table不存在room_master_table
标签: java android android-room