让我们说有两个最喜欢的食物清单: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的名单应该被清除。
答案 0 :(得分:0)
<强>解决!强>
可能有几种方法可以解决这个问题,但我收到的答案和网上发现的并没有做到这一点。我只是编写了代码而且它有效!
我的代码
这是我的合并功能。
我的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).")
}