Выполните миграцию области из одного списка в другой

В моей модели я хочу перенести 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"] без добавления, но также не мог заставить его работать.

Каково реальное решение этой проблемы миграции, может ли кто-нибудь указать мне правильное направление?


person BObereder    schedule 01.06.2016    source источник


Ответы (2)


Проблема здесь в том, что вы неявно пытаетесь добавить объекты, которые уже управляются в другой области, в список, что, как правило, недопустимо. Другое царство здесь - это старая предыдущая версия.

Вы можете решить эту проблему, выполнив следующие действия при перечислении своей модели:

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)
    }
}
person marius    schedule 02.06.2016
comment
А как насчет списка в список? stackoverflow.com/questions/53627783/ - person Slavcho; 05.12.2018

Можете ли вы попробовать следующий код? Я думаю, что ошибка «объект уже сохраняется» возникла из-за сохранения 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)
    }
})
person kishikawa katsumi    schedule 02.06.2016
comment
А как насчет списка в список? stackoverflow.com/questions/53627783/ - person Slavcho; 05.12.2018