Realm Swift迁移List<String>到EmbeddedObject列表报错如何解决
问题原因
EmbeddedObject 是 Realm 中的嵌入类型对象,不能脱离父对象独立存在,你调用的migration.create(_:value:)方法仅用于创建可独立存储的普通 Object 子类实例,所以会触发“Embedded objects cannot be created directly”错误。
正确迁移方案
不需要手动创建 ChildObject 实例,直接通过字典赋值的方式让 Realm 自动生成绑定到父对象的嵌入对象即可,完整实现如下:
1. 模型定义参考
// 新增的嵌入对象模型 class ChildObject: EmbeddedObject { @Persisted var name: String } // 升级后的 ParentObject 模型 class ParentObject: Object { // 原List<String>类型属性修改为List<ChildObject> @Persisted var children: List<ChildObject> // 其余原有属性保持不变 }
2. 迁移逻辑实现
升级 schema 版本,在迁移闭包中遍历旧数据批量转换:
let realmConfig = Realm.Configuration( // 版本号需比原有schema版本至少高1 schemaVersion: 2, migrationBlock: { migration, oldSchemaVersion in // 仅当旧版本低于当前新版本时执行迁移 guard oldSchemaVersion < 2 else { return } migration.enumerateObjects(ofType: ParentObject.className()) { oldObj, newObj in // 读取旧版本中存储的字符串数组 guard let oldStringList = oldObj?["children"] as? [String] else { return } // 转换为属性字典数组后直接赋值给新对象的children属性 // Realm会自动创建对应的ChildObject嵌入对象并关联到当前父对象 let newChildList = oldStringList.map { ["name": $0] } newObj?["children"] = newChildList } } ) // 应用配置到默认Realm Realm.Configuration.defaultConfiguration = realmConfig
核心说明
- 嵌入对象的创建必须依附于父对象的属性赋值操作,不能单独调用创建方法
- 赋值时支持直接传入符合属性结构的字典、字典数组,Realm会自动完成类型转换和关联绑定
- 原有字符串数据会完整保存在新生成的ChildObject的name属性中,不会丢失
内容的提问来源于stack exchange,提问作者JWK
相关产品推荐
相关产品推荐

