我如何将NSManagedObject从一个上下文复制或移动到另一个上下文?

问题描述 投票:54回答:5

我假设我是一个相当标准的设置,其中一个永不保存的暂存器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中创建一个新对象,并手动从旧对象中复制每个键值对,但是我对该解决方案并不满意。 (我遇到了许多不同的托管对象,因此我不想编写和更新副本:在继续开发过程中使用所有这些对象的方法。)是否有更好的方法?

cocoa cocoa-touch core-data nsmanagedobject nsmanagedobjectcontext
5个回答
54
投票

首先,在单个线程上具有多个NSManagedObjectContext不是标准配置。 99%的时间您只需要一个上下文,这将为您解决这种情况。

为什么您觉得需要多个NSManagedObjectContext

更新

这实际上是我认为有意义的少数用例之一。为此,您需要将对象从一个上下文递归复制到另一个上下文。工作流程如下:

  1. 在持久上下文中创建新对象
  2. 从源对象获取属性的字典(使用-dictionaryWithValuesForKeys-[NSEntityDescription attributesByName]进行此操作。
  3. 将值的字典设置到目标对象上(使用-setValuesForKeysWithDictionary
  4. 如果有关系,则需要递归进行此复制,并通过硬编码(以避免某些循环逻辑)或通过使用-[NSEntityDescription relationshipsByName]来遍历这些关系>
  5. 正如另一个人所提到的,您可以从The Pragmatic Programmers Core Data Book的书中下载示例代码,并查看解决此问题的一种方法。当然,在本书中,我会进行更深入的讨论:)


9
投票

该文档具有误导性和不完整。 objectID方法本身不会复制对象,它们只是保证您已获得所需的特定对象。


6
投票

我自己也遇到了同样的问题,并发现了有关已创建的断开连接的实体的文章,以后可以将其添加到上下文中:http://locassa.com/temporary-storage-in-apples-coredata/


1
投票

[您需要确保保存managedObject所在的上下文。为了在不同的上下文中获取同一对象,它必须存在于持久性存储中。


0
投票

Swift 5

© www.soinside.com 2019 - 2024. All rights reserved.