无法在 NSManagedObjects 之间建立关系

Posted

技术标签:

【中文标题】无法在 NSManagedObjects 之间建立关系【英文标题】:Can't establish a relationship between NSManagedObjects 【发布时间】:2012-11-05 14:39:08 【问题描述】:

我有 1 个 ToDo 对象,我正在创建 1 个 Report 对象。它们都是同一个 NSManagedObjectContext 的不同 MOC 创建的 NSManagedObject。为了清楚起见, NSManagedObjectContext 是我的 PersistenceStore 类的一个 ivar。

ToDo 对象来自一个数组,该数组继承自 PersistenceStore 中的一个方法,该方法返回包含保存在 NsPresistentStoreCoordinator 中的对象的数组。 todo 对象作为属性传递给我应该初始化报告的类。

报告类从 PersistenceStorage NSManagedObject 的 MOC 初始化,代码行如下:

NSManagedObjectContext *context = [store managedObjectContext];
Report *report = [NSEntityDescription insertNewObjectForEntityForName:@"Report" inManagedObjectContext:context];

Todo 和 Report 对象具有一对一的关系。但是我尝试设置的关系我得到了错误

非法尝试在不同上下文中的对象之间建立关系“待办事项”

在我看来,我使用的是相同的 NSManagedObjectContext。有人可以帮我吗?

【问题讨论】:

【参考方案1】:

查找另一个实体的上下文:

NSManagedObjectContext *context = [store managedObjectContext];

 NSManagedObject *ctx = [context existingObjectWithID:[todo objectID] error:&error];
Report *report = [NSEntityDescription insertNewObjectForEntityForName:@"Report" inManagedObjectContext:ctx];

【讨论】:

您的意思可能是ctxNSManagedObjectContext 而不仅仅是NSManagedObject 我修好了。我使用了您的解决方案的一部分: Report 对象也有其他关系,但是使用原始上下文,所以如果我使用过您的解决方案,我会遇到其他关系的问题。然后解决方案是NSManagedObjectContext *context = [store managedObjectContext]; Report *report = [NSEntityDescription insertNewObjectForEntityForName:@"Report" inManagedObjectContext:context]; NSManagedObject *object = [context objectRegisteredForID:[currentTodo objectID]]; [report setTodo:((ToDo*) object)]; 【参考方案2】:

我找到了解决方案。我使用了 NeverBe 的部分答案。

NSManagedObjectContext *context = [store managedObjectContext]; 
Report *report = [NSEntityDescription insertNewObjectForEntityForName:@"Report" inManagedObjectContext:context]; 
NSManagedObject *object = [context objectRegisteredForID:[currentTodo objectID]]; 
[report setTodo:((ToDo*) object)];

我没有使用 NeverBe 答案的原因是 Report 对象在同一上下文中有其他关系。如果我复制 Todo 对象的上下文,我会在其他关系中遇到同样的问题。

【讨论】:

以上是关于无法在 NSManagedObjects 之间建立关系的主要内容,如果未能解决你的问题,请参考以下文章

同一个 NSManagedObjects 之间的多重关系

NSManagedObjects 的 isEqual

无法在服务器(SpringBoot)和 iOS 之间建立 WebSocket 连接

丢弃 NSManagedObjects

使用 setPropertiesToFetch 时将数据保存在 NSManagedObjects

核心数据:在表格视图中滚动时,存储在数组中的 NSManagedObjects 变为 nil