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

Adding One CoreData List to Another

假设有两个最喜欢的食物清单:约翰尼的清单和简的清单。它们都在 CoreData 中,是独立的实体,但具有相同的属性。两者都有四个属性:食物名称、秘密成分、评级和获取地点。

用户点击按钮合并两个列表。具体来说,Jane 的列表现在应该显示在 Johnny 的列表中,但她的项目应该排在第一位。

一组非常简单的列表示例:

预合并 - Johnny 的列表(只有 1 条记录)

苹果派 - 苹果 - 4.5 - 苏珊的晚餐

预合并 - Jane 的列表(有 2 条记录)

火鸡大餐 - 火鸡 - 5.0 - 妈妈的房子 -

烧烤晚餐 - 手撕猪肉 - 4.0 - 6 号公路 Rib Shack

Post 合并 - Johnny 的列表(有 3 条记录)

火鸡大餐 - 火鸡 - 5.0 - 妈妈家

烧烤晚餐 - 手撕猪肉 - 4.0 - 6 号公路 Rib Shack

苹果派 - 苹果 - 4.5 - 苏珊的晚餐

Johnny 的 3 项新列表应保存在 CoreData 中 Johnny 的旧列表。简的列表应该被清除。

已解决!

可能有几种方法可以解决这个问题,但我收到的答案和在网上找到的答案并没有解决问题。我只是尝试编写代码并且它有效!

我的代码

这是我的合并函数。

  • 它只传递一个参数:目的地名称。那是因为我的源列表上下文已经在函数外设置了。
  • 或者,您可以传递两个参数,列表 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).")
    

    }

祝你好运!