iOS-在领域迁移中创建关系

时间:2018-11-17 10:43:45

标签: ios swift realm

我正在努力在Realm中创建迁移。在旧的架构中,我曾经使用过这样的类

class A: Object {
    @dynamic var identifier = 0
    @dynamic var bID = 0
}

class B: Object {
    @dynamic var identifier = 0
}

现在我很想创建看起来像这样的A类

class A: Object {
    @dynamic var identifier = 0
    @dynamic var b: B?
}

但是我无法编写一个可行的迁移方法。

更新:我要实现的目标是这样的

migration.enumerateObjects(ofType: A.className(), { (old, new) in
    guard let bID = old?["bID"] as? Int else {
        new?["b"] = nil
        return
    }
    new?["b"] = (try! Realm()).object(ofType: B.self, forPrimaryKey: bID)
})

希望现在变得更清楚了。

1 个答案:

答案 0 :(得分:0)

我发现了这个github问题-https://github.com/realm/realm-cocoa/issues/1385,我想现在不可能了。

所以我的解决方案是创建一个迁移字典,其中包含应该在执行迁移后创建的关系的信息,然后自己通过调用realm.write { }创建关系。

如果原始bID属性不会被删除,则不需要字典。

这是我创建的代码

var migrationDict = [Int: Int]()

let configuration = Realm.Configuration(schemaVersion: 2, migrationBlock: { (migration, oldVersion) in
    if oldVersion < 2 { 
        migration.enumerateObjects(ofType: A.className(), { (old, new) in
            if let bID = old?["bID"] as? Int, let id = old?["identifier"] as? Int {
                migrationDict[id] = bID
            }
        }
    }
})

Realm.Configuration.defaultConfiguration = configuration

let realm = try! Realm()
try! realm.write {
    migrationDict.forEach { aID, bID in
        // set the A.b relation here
    }
}