我有两个实体,它们具有完全相同的三个属性(name,desc,displayOrder),两者都有一些记录,我的目标是添加/插入来自"实体1"进入"实体2"。
关闭,但没有雪茄
我认为我的代码非常接近。控制台打印输出显示我的代码成功发送了"实体1"到"实体2"并保存它。但他们互相拯救!移动并保存第一个项目,然后移动第二个项目,但复制先前移动的项目。最终结果:只有最后移动的项目实际显示在最终的"实体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开始 - 然后我的代码移动/复制另一项实体2和显示顺序值是:3,4,5)
问题:我可以添加或修复哪些代码来进行此次转移我尝试工作了!?!
加分问题:转移后如何快速/轻松清除&#34;实体1&#34;
中的所有值答案 0 :(得分: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.然后,抓取返回的对象将具有displayOrder
3,4等我认为当你移动insertNewObjectForEntityForName
时,这一切都会变得很好。