无法在 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];
【讨论】:
您的意思可能是ctx
是NSManagedObjectContext
而不仅仅是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 之间建立关系的主要内容,如果未能解决你的问题,请参考以下文章
无法在服务器(SpringBoot)和 iOS 之间建立 WebSocket 连接