Перемещение объекта CoreData между объектами не работает

У меня есть две сущности, и они имеют одни и те же три атрибута (name, desc, displayOrder), у обеих есть несколько записей, и моя цель - добавить / вставить каждый элемент из "Entity 1" в "Entity 2".

Близко, но не сигара

Я думаю, что мой код довольно близок. Распечатка консоли показывает, что мой код успешно отправляет каждый элемент в "Объекте 1" в "Объект 2" и сохраняет его. НО они экономят друг на друге! Первый элемент перемещается и сохраняется, затем второй элемент перемещается, но копируется поверх элемента, который был ранее перемещен. Конечный результат: только последний перемещенный элемент фактически отображается в финальной "сущности 2".

Вопрос: Как мне это исправить?

@IBAction func testOutMoveList(sender: AnyObject) {

    //Setup 'Do Later' context
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext!

    let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)

    //Get sorted CoreData list and assign it to targetList_Cntxt
    let fetchRequest = NSFetchRequest(entityName: "Entity2")
    let sortDescriptor = NSSortDescriptor(key: "displayOrder", ascending: true)
    fetchRequest.sortDescriptors = [ sortDescriptor ]
    do {
        let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]

        if let results = fetchedResults {
            entity2_Cntxt = results
        }
    } catch {
        print(error)
    }

    for i in 0..<entity1.count {
        //Grab a Today task item
        let itemToMove = entity1_Cntxt[i]

        //Assign the Today item's contents to variables
        let nameToTransfer = itemToMove.valueForKey("name") as? String
        let descToTransfer = itemToMove.valueForKey("desc") as? String
        //Assign the Today item's contents to the target's 'task' object
        new_Ent2_Item.setValue(nameToTransfer, forKey: "name")
        new_Ent2_Item.setValue(descToTransfer, forKey: "desc")

        //Insert the item!!
        entity2_Cntxt.insert(new_Ent2_Item, atIndex: 0)
    }

//Updates target list in Core Data after append, delete, and drag/drop
func update_TargetDisplayOrder() {
    for i in 0..<entity2_Cntxt.count {
        let item = entity2_Cntxt[i]
        item.setValue( i, forKey: "displayOrder" )
    }
}

Возможная подсказка: я заметил, что displayOrder, кажется, не обновляется правильно. Первый элемент должен быть 0, второй должен быть 1 и т. Д., Но вместо этого каждый раз, когда код циклически повторяется, наименьший displayOrder становится на 1 выше (список из трех элементов может начинаться со значений 2,3,4 - тогда мой код перемещает / копирует другой элемент для объекта 2, и значения порядка отображения: 3,4,5)

Вопрос: Какой код я могу добавить или исправить, чтобы сделать эту передачу я пытаюсь работать!?!

Бонусный вопрос: пост-перевод, как мне быстро / легко очистить все значения из "сущности 1"

1 ответ

Решение

Короткий ответ: вам нужно переместить эту строку:

let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)

так что это внутри цикла for:

for i in 0..<entity1.count {
    //Grab a Today task item
    let itemToMove = entity1_Cntxt[i]
    // Create the corresponding new Entity2 object:
    let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)
    //Assign the Today item's contents to variables
    let nameToTransfer = itemToMove.valueForKey("name") as? String
    let descToTransfer = itemToMove.valueForKey("desc") as? String
    //Assign the Today item's contents to the target's 'task' object
    new_Ent2_Item.setValue(nameToTransfer, forKey: "name")
    new_Ent2_Item.setValue(descToTransfer, forKey: "desc")

    //Insert the item!!
    entity2_Cntxt.insert(new_Ent2_Item, atIndex: 0)
}

Чтобы объяснить: insertNewObjectForEntityForName это то, что на самом деле создает новый объект Entity2. В исходном положении эта строка запускается только один раз, поэтому создается только один объект Entity2. Ваш for Затем цикл изменяет значения атрибутов и вставляет их в начало entity2_Cntxt массив (несколько раз). Обратите внимание, что последний шаг в for петли, entity2_Cntxt.insert(new_Ent2_Item, atIndex: 0) не создает новый объект и не копирует new_Ent2_Item, он просто вставляет его в начало массива. С исправленным кодом новый объект Entity2 будет создаваться каждый раз в цикле.

Учитывая displayOrder проблема, если вы осмотрите entity2_Cntxt При каждом выполнении массива через цикл вы должны обнаружить (с вашим исходным кодом), что массив содержит один и тот же объект Entity2 несколько раз, а затем объекты, полученные из выборки. предполагать entity2_Cntxt содержит новый объект три раза (по индексам 0,1,2). Ваш update_TargetDisplayOrder Метод будет затем установить этот объект displayOrder до 0, затем 1, затем 2. И тогда объекты, возвращаемые извлечением, будут иметь displayOrder 3, 4 и т. Д. Я думаю, что все это будет хорошо, когда вы перемещаете insertNewObjectForEntityForName как указано выше.

Другие вопросы по тегам