我有这个定义
@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
和架构中的空格重新创建它,但我不明白为什么我需要这样做这是因为数据没有改变,所以感觉就像是“黑客”。
发生了什么?
最佳答案
遗憾的是,这是 Room 自动为您做事的成本。
Room 并不真正比较每个架构元素来确定架构是否有任何更改。
相反,Room Persistence Library 会为数据库的每个版本生成唯一的 identity_hash
。它存储在room_master_table。
如果我没有记错的话,它将忽略空格,但由于 \n
是一个真实的字符,它将生成一个新的 identity_hash
并会导致您遇到的问题现在。
您可以在设备 SQLite DB 上的 room_master_table
中查看哈希值。
关于android - 使用 Kotlin 多行字符串和 Room 添加缩进后数据库迁移失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809370/