我假设我是一个相当标准的设置,其中一个永不保存的暂存器MOC(包含一堆从Web下载的对象)和另一个永久性的MOC(用于持久保存对象)。当用户从便笺中选择一个对象添加到她的库中时,我要1)从便笺中删除该对象并插入永久性MOC,或者2)将对象复制到永久性MOC。 Core Data FAQ说我可以复制这样的对象:
NSManagedObjectID *objectID = [managedObject objectID];
NSManagedObject *copy = [context2 objectWithID:objectID];
((在这种情况下,context2将是永久性MOC。)但是,当我这样做时,复制的对象出现了故障;数据最初无法解析。当它确实得到解决时,稍后,所有值均为nil。原始被管理对象的任何数据(属性或关系)都不会被实际复制或引用。因此,我看不到使用此objectWithID:方法与仅使用insertNewObjectForEntityForName:将一个全新的对象插入永久性MOC之间有什么区别。
我意识到我可以在永久性MOC中创建一个新对象,并手动从旧对象中复制每个键值对,但是我对该解决方案并不满意。 (我遇到了许多不同的托管对象,因此我不想编写和更新副本:在继续开发过程中使用所有这些对象的方法。)是否有更好的方法?
首先,在单个线程上具有多个NSManagedObjectContext
是不是标准配置。 99%的时间您只需要一个上下文,这将为您解决这种情况。
为什么您觉得需要多个NSManagedObjectContext
?
这实际上是我认为有意义的少数用例之一。为此,您需要将对象从一个上下文递归复制到另一个上下文。工作流程如下:
-dictionaryWithValuesForKeys
和-[NSEntityDescription attributesByName]
进行此操作。-setValuesForKeysWithDictionary
)-[NSEntityDescription relationshipsByName]
来遍历这些关系>正如另一个人所提到的,您可以从The Pragmatic Programmers Core Data Book的书中下载示例代码,并查看解决此问题的一种方法。当然,在本书中,我会进行更深入的讨论:)
该文档具有误导性和不完整。 objectID方法本身不会复制对象,它们只是保证您已获得所需的特定对象。
我自己也遇到了同样的问题,并发现了有关已创建的断开连接的实体的文章,以后可以将其添加到上下文中:http://locassa.com/temporary-storage-in-apples-coredata/
[您需要确保保存managedObject
所在的上下文。为了在不同的上下文中获取同一对象,它必须存在于持久性存储中。
Swift 5