将一个 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).")
}
祝你好运!
假设有两个最喜欢的食物清单:约翰尼的清单和简的清单。它们都在 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).")
}
祝你好运!