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

标签 android kotlin android-room

我有这个定义

@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/

相关文章:

java - 房间 - 编译器消息文件损坏

android - 带有 Kotlin 协程的房间观察数据库变化

android - onCreateDialog 不刷新消息

kotlin - 创建Kotlin对象的新实例

kotlin - 在 Kotlin 中查找文件

android-room - Android 架构组件(MVVM) - 使用存储库模式处理远程和本地数据的理想方式

c# - 如何将流中的图像另存为在 retrofit2 中发送到 wcf web 服务

android - android studio导入jsoup库失败?

android - 公共(public)内联乐趣 String.toFloat() : Float defined in kotlin. 文本

php - android room not null 约束在插入时失败