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

时间:2015-09-24 16:10:17

标签: ios swift core-data nsmanagedobjectcontext nsmanagedobjectmodel

我有两个实体,它们具有完全相同的三个属性(name,desc,displayOrder),两者都有一些记录,我的目标是添加/插入来自"实体1"进入"实体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)

问题:我可以添加或修复哪些代码来进行此次转移我尝试工作了!?!

加分问题:转移后如何快速/轻松清除&#34;实体1&#34;

中的所有值

1 个答案:

答案 0 :(得分: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时,这一切都会变得很好。