gpt4 book ai didi

android - 使用 Kotlin 多行字符串和 Room 添加缩进后数据库迁移失败

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:23 26 4
gpt4 key购买 nike

我有这个定义

@Entity
class Call(@PrimaryKey val number: String)

@DatabaseView(
"""
SELECT call.number AS callNumber FROM call
"""
)
data class UnknownCall(
val callNumber: String
)

然后我生成 Room 架构,它对应于:

{
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "e64fd3352f3bec16e1caa3c70edf3793",
"entities": [
{
"tableName": "Call",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`number` TEXT NOT NULL, PRIMARY KEY(`number`))",
"fields": [
{
"fieldPath": "number",
"columnName": "number",
"affinity": "TEXT",
"notNull": true
}
],
"primaryKey": {
"columnNames": [
"number"
],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"views": [
{
"viewName": "UnknownCall",
"createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT call.number AS callNumber FROM call"
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'e64fd3352f3bec16e1caa3c70edf3793')"
]
}
}

当我在 View 上做一些多行缩进时,例如:

@DatabaseView(
"""
SELECT call.number AS callNumber
FROM call
"""
)
data class UnknownCall(
val callNumber: String
)

为该 View 生成的架构更改为:

"views": [
{
"viewName": "UnknownCall",
"createSql": "CREATE VIEW `${VIEW_NAME}` AS SELECT call.number AS callNumber \n FROM call"
}
],

这会导致异常检查迁移,只是因为我在 SQL 查询中添加了一些空格

我不明白这里发生了什么,我不得不添加一个迁移来删除我的 View 并使用正确的 \n 和模式中的空格重新创建它,但我不明白为什么我需要这样做这是因为数据没有改变,所以感觉像是一个“hack”。

发生了什么事?

最佳答案

遗憾的是,这是 Room 自动为您做事的代价。Room 并不真正比较每个架构元素来确定架构是否有任何更改。相反,Room Persistence Library 会为每个版本的数据库生成唯一的 identity_hash。它存储在 room_master_table。

如果我没记错的话它会忽略空格但是因为 \n 是一个真实的字符它会生成一个新的 identity_hash 并且会导致你遇到的问题现在。

您可以在设备 SQLite 数据库的 room_master_table 中看到哈希值。

关于android - 使用 Kotlin 多行字符串和 Room 添加缩进后数据库迁移失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809370/

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