我正在努力在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)
})
希望现在变得更清楚了。
答案 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
}
}