gpt4 book ai didi

ios - CoreData 对象在实体之间移动不起作用

转载 作者:行者123 更新时间:2023-11-29 01:37:54 24 4
gpt4 key购买 nike

我有两个实体,它们具有完全相同的三个属性(名称、描述、显示顺序),两者都有一些记录,我的目标是将“实体 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)

问题:我可以添加或修复哪些代码才能使我正在尝试的此传输成功!?!

额外问题:传输后如何快速/轻松地清除“实体 1”中的所有值

最佳答案

简短的回答是你需要移动这条线:

let new_Ent2_Item = NSEntityDescription.insertNewObjectForEntityForName("Entity2", inManagedObjectContext: managedContext)

所以它在 inside 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 object 几次,然后是从 fetch 中获得的对象。假设 entity2_Cntxt 包含新对象三次(在索引 0、1、2 处)。然后,您的 update_TargetDisplayOrder 方法会将该对象的 displayOrder 设置为 0,然后是 1,然后是 2。然后 fetch 返回的对象将具有 displayOrder 3、4 等。我认为,当您像上面那样移动 insertNewObjectForEntityForName 时,一切都会好起来的。

关于ios - CoreData 对象在实体之间移动不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com