升级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属性的非空推断逻辑做了调整:旧版本中,带有默认值的私有主键字段可能被识别为可空属性;新版本则会正确将其标记为必填属性,因此触发了迁移要求。
解决步骤
给主键字段显式标记非空(可选但推荐)
为id字段添加@Required注解,明确告知Realm该属性为必填:open class ToDoItem : RealmObject() { @PrimaryKey @Required private var id = UUID.randomUUID().toString() // 其余字段保持不变 }添加自定义迁移逻辑
仅升级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)关于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)验证迁移结果
重新运行应用,Realm会自动执行迁移逻辑,将ToDoItem.id标记为必填属性,错误提示将不再出现。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

