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
相关产品推荐
相关产品推荐

