我对 Realm 迁移示例应用程序做了一些实验,并提出了这个潜在的解决方案:
在迁移块中,您只能通过migration
对象与您的 Realm 文件进行交互。任何在迁移过程中直接访问 Realm 文件的尝试都将导致异常。
话虽如此,嵌套调用migration.enumerateObjects
引用不同的 Realm 模型对象类是可能的。因此,它应该只是最初枚举Customer
对象的问题,并且在每次迭代中,枚举Solution
对象以找到具有正确data
值的对应对象。一旦找到,应该可以Customer
使用来自对象的数据设置Solution
对象。
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
migration.enumerateObjects(ofType: Customer.className()) { oldCustomerObject, newCustomerObject in
migration.enumerateObjects(ofType: Solution.className()) { oldSolutionObject, newSolutionObject in
//Check that the solution object is the one referenced by the customer
guard oldCustomerObject["solution"].isEqual(oldSolutionObject) else { return }
//Copy the data
newCustomerObject["data"] = oldSolutionObject["data"]
}
}
}
}
})
我觉得我需要强调的是,这段代码绝不是经过测试的,也不能保证在目前的状态下工作。所以我建议你确保在一些你不会错过的虚拟数据上彻底测试它。:)