将一个CoreData列表添加到另一个

时间:2015-09-21 15:18:30

标签: ios swift core-data merge

让我们说有两个最喜欢的食物清单:Johnny's List和Jane's List。它们都在CoreData中,是独立的实体,但具有相同的属性。两者都有四个属性:食品名称,秘密成分,评级,以及从何处获取。

用户点击按钮以合并两个列表。具体来说,Jane的名单现在应该出现在Johnny's,但她的项目应该先行。

一组非常简单的示例:

预合并 - 约翰尼的名单(只有1条记录)

Apple Pie - 苹果 - 4.5 - 苏珊的晚餐

预合并 - 简名单(有2条记录)

土耳其晚餐 - 火鸡 - 5.0 - 妈妈的家 -

烧烤晚餐 - 拉猪肉 - 4.0 - Route 6 Rib Shack

合并后 - 约翰尼的名单(有3条记录)

土耳其晚餐 - 火鸡 - 5.0 - 妈妈的房子

烧烤晚餐 - 拉猪肉 - 4.0 - Route 6 Rib Shack

Apple Pie - 苹果 - 4.5 - 苏珊的晚餐

Johnny的3个项目的新列表应该保存在CoreData中的Johnny旧列表中。 Jane的名单应该被清除。

1 个答案:

答案 0 :(得分:0)

<强>解决!

可能有几种方法可以解决这个问题,但我收到的答案和网上发现的并没有做到这一点。我只是编写了代码而且它有效!

我的代码

这是我的合并功能。

  • 只传递一个参数:目的地名称。那是因为我的源列表上下文已经在函数外部设置了。
  • 或者,您可以传递两个参数,列表A和列表B的名称,并在函数中设置两个上下文。
  • 我的CoreData fetch还有一个你可能不需要的排序谓词。

    func merge_ListA_Into_ListB (targetList: String) {
    //Setup Targetlist context
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    
    //Get sorted CoreData list and assign it to targetList_Cntxt
    let fetchRequest = NSFetchRequest(entityName: targetList)
    let sortDescriptor = NSSortDescriptor(key: "displayOrder", ascending: true)
    fetchRequest.sortDescriptors = [ sortDescriptor ]
    do {
        let fetchedResults = try managedContext.executeFetchRequest(fetchRequest) as? [NSManagedObject]
    
        if let results = fetchedResults {
            targetList_Cntxt = results
        }
    } catch { print(error)  }
    
    for i in (0..<listA_Cntxt.count).reverse() {
        //Grab a ListA task item
        let itemToMove = listA_Cntxt[i]
    
        //Assign the ListA item's contents to variables
        let nameToTransfer = itemToMove.valueForKey("name") as? String
        let descToTransfer = itemToMove.valueForKey("desc") as? String
        //Assign the ListA item's contents to the target's object
        let newItem = NSEntityDescription.insertNewObjectForEntityForName(targetList, inManagedObjectContext: managedContext)
        newItem.setValue(nameToTransfer, forKey: "name")
        newItem.setValue(descToTransfer, forKey: "desc")
    
        //Insert the item!!
        targetList_Cntxt.insert(newItem, atIndex: 0)
    }
    
    //Calls function that updates each records sort/display #
    update_TargetDisplayOrder()
    try! managedContext.save()
    print("List merged into \(targetList).")
    

    }

祝你好运!