更改nullable并添加ColumnInfo注解后如何迁移Room数据库?

问题描述 投票:0回答:1

我最近像这样更改了表类。

data class Product(
    @PrimaryKey(autoGenerate = true)
    val seq: Long,
    val pucd: String,
    @ColumnInfo(name = "updated_at")
    @SerialName("updated_at")
    val updatedAt: String?
)
data class Product(
    @PrimaryKey(autoGenerate = true)
    val seq: Long,
    @ColumnInfo(name = "pucd") // added ColumnInfo
    val pucd: String,
    @ColumnInfo(name = "updated_at")
    @SerialName("updated_at")
    val updatedAt: String // to non-null
)

我崩溃了。那说我可能需要升级版本。但我仍然崩溃了。 所以,我想提取模式进行迁移。

我记得 2-3 年前,json 模式文件帮助我复制和粘贴迁移查询。但我只看到

createSql
setupQueries
的东西可以称为查询。

但是所有的createSql都是在表不存在的情况下创建表的。和 setUpQueries 一样。

"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, '0d7f64a73a5cbc11b1b1e481b24432ef')"
    ]

我不知道什么是散列以及它的作用。而且它似乎不是为了迁移。我该如何解决这个问题?

android sql kotlin android-room
1个回答
0
投票

我该如何解决这个问题?

  • 修改完成后首先编译项目(Ctrl + F9)。
  • 接下来从 Android Studio 的 Android 视图中找到 java(生成的)。
  • 找到与
    @Database
    注解类同名但后缀为_Impl的类。
  • 找到createAllTables方法,用于创建表的SQL,包括所需的列定义将在该方法中。
  • 假设您希望迁移保留任何现有数据,那么您将希望在迁移中包含以下内容。
    • ALTER TABLE product RENAME TO original_product;
  • 根据上面找到的 SQL 创建表(即创建更改表的新版本)
  • 使用重命名的原始表中的数据填充新表
    • INSERT INTO product SELECT seq,pucd,coalesce(updatedat,'unknown') FROM original_product;
    • 注意空值而不是失败将使用值unknown,您可能希望将值更改为更合适的值。
  • 最后你可以删除重命名的原始表
    • DROP TABLE IF EXISTS original_product;

我不知道什么是散列以及它的作用

散列是模式的散列。它是在编译时生成的。它也存储在 room_master_table 中。如果架构发生更改(如您的情况),则编译版本将在运行时与存储版本进行比较。如果它们不同,就会发生崩溃。

© www.soinside.com 2019 - 2024. All rights reserved.