CoreData 对象在实体之间移动不起作用

CoreData Object Move Between Entities Not Working

我有两个实体,它们具有完全相同的三个属性(name、desc、displayOrder),都有少量记录,我的目标是 add/insert "Entity 1" 中的每个项目进入 "Entity 2"。

接近,但没有雪茄

我认为我的代码非常接近。控制台输出显示我的代码已成功将 "Entity 1" 中的每个项目发送到 "Entity 2" 并保存。但是他们互相拯救!移动并保存第一个项目,然后移动第二个项目但复制之前移动的项目。最终结果:只有最后移动的项目实际出现在最终 "Entity 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 开始 - 然后我的代码 moves/copies实体 2 的另一个项目和显示顺序值是:3,4,5)

问题:我可以添加或修复什么代码来使我正在尝试的传输工作!?!

奖金问题: Post-转移我如何quickly/easily清除"Entity 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。然后 fetch 返回的对象将具有 displayOrder 3、4 等。我认为这当你像上面那样移动 insertNewObjectForEntityForName 时,一切都会好起来的。