我有两个MOC:第一个是根上下文。保存此上下文时,更改将保存到持久性存储协调器。第二个MOC有第一个MOC作为父母。当我保存第二个MOC时,我还必须保存第一个MOC,以便将第二个MOC中的更改保存到持久性存储协调器。
我使用第二个MOC让用户编辑一个对象。他可以保存或取消更改。保存更改后,将保存所有MOC。当他取消更改时,我会拨打第二个MOC的rollback()
。
不幸的是,该对象来自第一个MOC。这意味着,我执行NSFetchRequest来获取第一个MOC上的对象。然后我创建第二个MOC,用户可以在其中编辑对象。但是有一个问题:当第二个MOC应该改变某些东西时,例如删除一个包含在用户想要编辑的原始对象数组中的对象,这是不可能的,因为MOC只能删除具有此功能的对象。 MOC作为背景。但是这个目标是在第一个MOC中提取的。
这就是为什么我需要在用户编辑对象之前以某种方式将对象从第一个MOC“转移”到第二个MOC。我不想再使用NSFetchRequest或其他东西获取对象,必须有更好的方法......
这可能吗?或者你建议完全不同,也许没有父语境?
答案 0 :(得分:1)
这是objectID
的{{1}}属性将派上用场的地方。
询问对象的ID
NSManagedObject
向子上下文询问具有该ID的托管对象
let objectID = myManagedObject.objectID
答案 1 :(得分:0)
我认为你可能会因此而复杂化。除非完全有必要保存建议的更改,否则没有理由为此有两个上下文。有多种方法可以处理临时数据,您可以使用它来比较实际记录而不将其存储两次。
为什么不直接创建NSManagedObject的副本并通过比较处理信息更正,或者只是将原始NSManagedObject替换为副本的数据然后保存?我个人更喜欢这个设置,因为我需要做的就是在需要更新时比较各个属性。
当需要完全更新时,您可以直接在一个NSManagedObject上直接工作而无需担心副本,因为您可能会替换整个事情。就像我说的那样,还有其他方法可以处理,但是如果你必须同时拥有两个上下文,然后寻找每个属性值与被替换值的比较,然后只需将它保存在父上下文中。