为什么我会得到:在不同环境中的对象之间建立关系的非法尝试

时间:2010-08-30 19:36:33

标签: iphone core-data

我只有一个托管对象上下文。

我已修改了托管对象库。

我想在每个托管对象中添加某些字段。将它们一个一个地添加到系统中的每个对象都需要花费太多时间,因此我决定以编程方式将它们添加到托管对象模型中。在应用程序委托中,我首先做:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

然后我遍历模型中的所有实体并修改它们并为每个实体设置新的属性数组:

for (NSEntityDescription *entity in entities) {
    NSAttributeDescription *idAttribute = [[NSAttributeDescription alloc] init];
    [idAttribute setName:@"id"];
    [idAttribute setAttributeType:NSStringAttributeType];
    [idAttribute setOptional:NO];
    [idAttribute setIndexed:YES];

等等。

似乎大部分工作正常。当我尝试将对象添加到我创建的新的一对一关系时,我遇到了问题。我从同一个托管对象上下文创建对象:

 self.action = [NSEntityDescription insertNewObjectForEntityForName:@"MobileObjectAction" inManagedObjectContext:managedObjectContext];
 self.user = [NSEntityDescription insertNewObjectForEntityForName:@"MobileUser" inManagedObjectContext:managedObjectContext];

当我到达

 [user setAction:action];

我得到:     由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'非法尝试在不同上下文中的对象之间建立关系'动作'...

我做错了什么?

2 个答案:

答案 0 :(得分:10)

在两个实体相关之前,在代码中放置一个断点。确保它们都是NSManagedObject的实例。

如果是,请确保它们都设置了NSManagedObjectContext并且设置为相同的指针。

显然,确保它们都是有效的对象。

上述测试之一很可能会被证明是错误的。

答案 1 :(得分:-1)

我有同样的问题并解决它:

  • 一个上下文(没有拆分/合并)。
  • 设置属性 - >并得到“非法企图在对象之间建立关系......”

所以 - W ha T 错了,我的桅杆 F 是不是正确?

答案很简单: 前

[meeting setCreator:    [self currentUser]];

[meeting setCreator:    _currentUser];

和信息

*的.h

@interface{
 Person*     _currentUser;
}
@property (readonly, retain) NSManagedObjectContext *managedObjectContext;
- (Person*)currentUser;

*。米

@synthesize managedObjectContext        = _managedObjectContext;

- (Person*)currentUser{
    return _currentUser;
}

- (NSManagedObjectContext *) managedObjectContext {

if (_managedObjectContext != nil) {
    return _managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return _managedObjectContext;
}