You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Realm插件至10.15.1后未变更类触发迁移要求问题

问题

将Realm插件升级至10.15.1版本后,尽管ToDoItem类代码未做任何修改,却收到如下错误提示:

Migration is required due to the following errors:

  • Property 'ToDoItem.id' has been made required.

相关实体类代码:

open class ToDoItem : RealmObject() {
    @PrimaryKey
    private var id = UUID.randomUUID().toString()
    var text: String = ""
    var colour: String = ""
    var isDone: Boolean = false
    var isTitle: Boolean = false
    var isImportant: Boolean = false

    fun getId(): String {
        return id
    }
}

按照@Jay的建议尝试更新schema版本,但仍出现相同错误:

val config = RealmConfiguration.Builder()
            .schemaVersion(2)
            .build()
Realm.setDefaultConfiguration(config)

看到Realm文档中有如下代码示例,但不知道该如何实例化RealmSchema:

val schema = RealmSchema() ???
    val config = RealmConfiguration.Builder(
            schema = setOf(ToDoItem::class)
    )
            .schemaVersion(2)
            .build()
    Realm.setDefaultConfiguration(config)
解决方案

错误原因

Realm 10.15.1对Kotlin属性的非空推断逻辑做了调整:旧版本中,带有默认值的私有主键字段可能被识别为可空属性;新版本则会正确将其标记为必填属性,因此触发了迁移要求。

解决步骤

  1. 给主键字段显式标记非空(可选但推荐)
    为id字段添加@Required注解,明确告知Realm该属性为必填:

    open class ToDoItem : RealmObject() {
        @PrimaryKey
        @Required
        private var id = UUID.randomUUID().toString()
        // 其余字段保持不变
    }
    
  2. 添加自定义迁移逻辑
    仅升级schema版本不足以解决问题,必须通过迁移器告知Realm如何处理属性的非空变更:

    val migration = Migration { realm, oldVersion, newVersion ->
        val schema = realm.schema
        // 针对版本1升级到版本2的迁移逻辑
        if (oldVersion < 2) {
            schema.get("ToDoItem")?.apply {
                // 将id字段标记为必填(旧数据中id作为主键本就不会为空,直接修改属性规则即可)
                setRequired("id", true)
            }
        }
    }
    
    val config = RealmConfiguration.Builder()
        .schemaVersion(2)
        .migration(migration) // 绑定迁移器
        .build()
    Realm.setDefaultConfiguration(config)
    
  3. 关于RealmSchema的正确用法
    不需要手动实例化RealmSchema,在迁移块中通过realm.schema即可获取当前数据库的schema实例。文档中的schema = setOf(ToDoItem::class)是用于配置时指定要管理的实体类集合,结合迁移器的完整配置如下:

    val migration = Migration { realm, oldVersion, newVersion ->
        // 迁移逻辑同上
    }
    
    val config = RealmConfiguration.Builder(
        schema = setOf(ToDoItem::class)
    )
        .schemaVersion(2)
        .migration(migration)
        .build()
    Realm.setDefaultConfiguration(config)
    
  4. 验证迁移结果
    重新运行应用,Realm会自动执行迁移逻辑,将ToDoItem.id标记为必填属性,错误提示将不再出现。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:03:30