gpt4 book ai didi

java - Room 如何验证数据完整性?数据库版本/哈希存储在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:59:51 27 4
gpt4 key购买 nike

我的目标是使用 Room 的新 createFromAsset API 从应用程序 Assets 加载预加载的数据库。但是,我注意到如果我预加载的数据库在 room_master_table 中没有有机(由 Room 生成)id 和身份哈希,我会收到“IllegalStateException:Room 无法验证数据完整性”。抛出异常。

我曾尝试使用由 Room 生成的精确数据库文件作为它复制过来的预加载数据库并且这有效,但我不确定为什么。这些数据库版本/ID/哈希值似乎保存在某处,Room 会根据这些版本对其进行验证。但是我已经尝试删除本地数据库并卸载应用程序,但仍然抛出相同的异常。

我想知道 room 如何在 room_master_table 中生成特定的 id 和散列以及它如何验证它们?

最佳答案

Room Persistence Library 为每个版本的数据库生成唯一的 identity_hash。它存储在 room_master_table 中。

每次您编译应用程序时,room 都会生成反射(reflect)您当前数据库模式的mIdentityHash。每当您第一次运行应用程序并调用数据库时,Room 都会将其与已存储在数据库中的 mLegacyHash 进行比较。因此,如果这两个哈希值不同,Room 将抛出 IlligalStateException

所有这些过程都是使用 注释处理库 完成的,您可以使用

添加到 build.gradle 文件中
kapt "androidx.room:room-compiler:$room_version"
// annotationProcessing androidx.room:room-compiler:$room_version in case you use Java

您可以查看房间 source code进行详细验证。看看RoomOpenHelper.java具有 checkIdentity() 函数的类,它们检查 identity_hash 并在两个 identity hash 不匹配时抛出异常。

如果您正在寻找 identity_key 的确切生成方式,请查看 SchemaIdentityKey.kt

希望对您有所帮助。

关于java - Room 如何验证数据完整性?数据库版本/哈希存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57547129/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com