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

RealmSwift迁移:如何将Parent的id复制到Child的parentId属性

RealmSwift 迁移:为Child添加parentId并关联Parent的id

步骤1:更新模型定义

先修改Child类,新增parentId属性:

class Parent: Object {
    @Persisted var id: Int
    @Persisted var name: String
    @Persisted var children: [Child]
}

class Child: Object {
    @Persisted var name: String
    @Persisted var parentId: Int // 新增关联字段
}

步骤2:编写迁移逻辑

在初始化Realm时,配置schema版本和迁移块,遍历现有数据完成赋值:

// 构建Realm配置
let realmConfig = Realm.Configuration(
    schemaVersion: 2, // 原版本号+1(比如之前是1则改为2)
    migrationBlock: { migration, oldSchemaVersion in
        // 仅处理低于当前版本的迁移
        guard oldSchemaVersion < 2 else { return }
        
        // 遍历所有Parent对象
        migration.enumerateObjects(ofType: Parent.className()) { oldParent, _ in
            guard let parentId = oldParent?["id"] as? Int else { return }
            
            // 获取该Parent对应的children列表
            if let oldChildren = oldParent?["children"] as? List<MigrationObject> {
                // 给每个Child设置对应的parentId
                oldChildren.forEach { $0["parentId"] = parentId }
            }
        }
    }
)

// 设置默认配置
Realm.Configuration.defaultConfiguration = realmConfig

// 触发迁移(打开Realm时自动执行)
do {
    _ = try Realm()
} catch {
    print("迁移执行失败:\(error.localizedDescription)")
}

关键说明

  • 版本号递增:schemaVersion必须比之前的版本号大,Realm才会识别到需要执行迁移
  • 迁移块操作:在迁移块中通过MigrationObject访问旧数据,用下标读写属性,不需要操作新的模型类
  • 数据关联逻辑:通过遍历每个Parent,将其id批量赋值给下属的所有Child,确保关联关系正确

注意事项

  • 迁移前请务必备份数据库,防止数据丢失
  • 如果项目中有多版本迁移历史,要保证版本判断的连续性(比如旧版本从0到1的逻辑也要保留)
  • 测试时使用真实场景数据验证,确保所有Child的parentId都正确关联到对应的Parent id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:52:47