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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:06:01