从一个列表执行Realm迁移到另一个列表

时间:2016-06-01 11:08:43

标签: ios swift realm realm-migration

在我的模型中,我想迁移List<Item>,其中该项目包含自定义类产品,如:

class Item: Object {

  dynamic var product: Product?

}

只需List<Product>

我尝试了不同的东西,但似乎没有任何效果。 例如:

let items = oldObject.dynamicList("items")

for item in items {
  let oldProduct = item["product"] as! MigrationObject
  productList.append(oldProduct)
}

这会导致错误,说明此对象已被保留。

如果我在迁移块中创建一个新产品,我的领域将会有重复的对象。

我还尝试直接分配到列表,例如:newObject!["products"],但没有追加,但也无法让它发挥作用。

迁移问题的真正解决方案是什么,有人能指出我正确的方向?

2 个答案:

答案 0 :(得分:2)

这里的问题是您隐式尝试将已经在另一个Realm中管理的对象添加到列表中,这通常是不允许的。这里的另一个领域是旧的旧版本。

您可以通过在枚举模型时执行以下操作来解决此问题:

migration.enumerate("ObjectWithProductsList") { (oldObject, newObject) in
    let productList = newObject.dynamicList("products")
    let items = oldObject.dynamicList("items")
    let newRealm = newObject.realm

    for item in items {
        let oldProduct = item["product"] as! MigrationObject
        let newProduct = newRealm.objects(Product).where("id = %@", oldProduct["id"])
        productList.append(newProduct)
    }
}

答案 1 :(得分:0)

您可以尝试以下代码吗?错误&#34;对象已经存在并且#34;我想是因为存储oldObject而发生的。

首先,枚举Item类以收集Product个对象。然后从Product获取newObject个对象。然后将对象附加到List<Product>

let objectToHoldListOfItems = migration.create("...")

migration.enumerate("Item", { (oldObject, newObject) in
    if let _ = oldObject, let newObject = newObject {
        let product = newObject["product"] as! DynamicObject

        let products = objectToHoldListOfItems["products"] as! List<DynamicObject>
        products.append(product)
    }
})