0

我有三个对象:

class Customer: Object {
    dynamic var solution: Solution!;
    ...
}

class Solution: Object {
    dynamic var data: Data!;
    ...
}

class Data: Object {
    ...
}

现在我需要将Data对象从移动SolutionCustomer使其变为:

class Customer: Object {
    dynamic var solution: Solution!;
    dynamic var data: Data!;
    ...
}

我不知道如何实现我的领域迁移方法,以便一切正常并且我不会丢失数据。

4

2 回答 2

2

我对 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"]
                }
            }
        }
    }
})

我觉得我需要强调的是,这段代码绝不是经过测试的,也不能保证在目前的状态下工作。所以我建议你确保在一些你不会错过的虚拟数据上彻底测试它。:)

于 2016-11-11T00:08:03.150 回答
0

斯威夫特 4,领域 3

我不得不迁移一个链接到另一个对象的领域对象。我想删除显式链接并将其替换为对象 ID。TiM 的解决方案让我大部分都成功了,只需要一点改进。

   var config = Realm.Configuration()
   config.migrationBlock = { migration, oldSchemaVersion in
        if oldSchemaVersion < CURRENT_SCHEMA_VERSION {

            // enumerate the first object type
            migration.enumerateObjects(ofType: Message.className()) { (oldMsg, newMsg) in 

                // extract the linked object and cast from Any to DynamicObject
                if let msgAcct = oldMsg?["account"] as? DynamicObject {

                    // enumerate the 2nd object type
                    migration.enumerateObjects(ofType: Account.className()) { (oldAcct, newAcct) in
                        if let oldAcct = oldAcct {

                             // compare the extracted object to the enumerated object
                             if msgAcct.isEqual(oldAcct) {

                                // success!
                                newMsg?["accountId"] = oldAcct["accountId"]
                            }
                        }
                    }
                }
            }
        }
于 2018-02-15T19:14:12.570 回答