kotlin 当我更改nullable并添加ColumnInfo注解时,如何迁移Room数据库?

sr4lhrrt  于 2023-04-07  发布在  Kotlin
关注(0)|答案(1)|浏览(146)

我最近把表类改成了这样。

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模式文件帮助我复制和粘贴迁移查询。但我只看到createSqlsetupQueries可以称为查询。
但是所有的createSql都是用来在表不存在的时候创建Table的。

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

我不知道什么是哈希和它做什么。而且它似乎不适合迁移。我如何解决这个问题?

whitzsjs

whitzsjs1#

我该如何解决这个问题?

  • 首先在进行更改后编译项目(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(updated_at,'unknown') FROM original_product;
  • 注意,null值将使用值unknown,而不是失败,您可能希望将该值更改为更合适的值。
  • 最后,您可以删除重命名的原始表
  • DROP TABLE IF EXISTS original_product;

我完全不知道什么是大麻,它有什么作用
hash是schema的hash。它是在编译时生成的。它也存储在room_master_table中。如果schema被更改(就像你的情况一样),那么编译后的版本将在运行时与存储的版本进行比较。如果它们不同,则会发生崩溃。

相关问题