CoreData 对象在实体之间移动不起作用
CoreData Object Move Between Entities Not Working
我有两个实体,它们具有完全相同的三个属性(name、desc、displayOrder),都有少量记录,我的目标是 add/insert "Entity 1" 中的每个项目进入 "Entity 2"。
接近,但没有雪茄
我认为我的代码非常接近。控制台输出显示我的代码已成功将 "Entity 1" 中的每个项目发送到 "Entity 2" 并保存。但是他们互相拯救!移动并保存第一个项目,然后移动第二个项目但复制之前移动的项目。最终结果:只有最后移动的项目实际出现在最终 "Entity 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 开始 - 然后我的代码 moves/copies实体 2 的另一个项目和显示顺序值是:3,4,5)
问题:我可以添加或修复什么代码来使我正在尝试的传输工作!?!
奖金问题: Post-转移我如何quickly/easily清除"Entity 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。然后 fetch 返回的对象将具有 displayOrder
3、4 等。我认为这当你像上面那样移动 insertNewObjectForEntityForName
时,一切都会好起来的。
我有两个实体,它们具有完全相同的三个属性(name、desc、displayOrder),都有少量记录,我的目标是 add/insert "Entity 1" 中的每个项目进入 "Entity 2"。
接近,但没有雪茄
我认为我的代码非常接近。控制台输出显示我的代码已成功将 "Entity 1" 中的每个项目发送到 "Entity 2" 并保存。但是他们互相拯救!移动并保存第一个项目,然后移动第二个项目但复制之前移动的项目。最终结果:只有最后移动的项目实际出现在最终 "Entity 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 开始 - 然后我的代码 moves/copies实体 2 的另一个项目和显示顺序值是:3,4,5)
问题:我可以添加或修复什么代码来使我正在尝试的传输工作!?!
奖金问题: Post-转移我如何quickly/easily清除"Entity 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。然后 fetch 返回的对象将具有 displayOrder
3、4 等。我认为这当你像上面那样移动 insertNewObjectForEntityForName
时,一切都会好起来的。