【问题标题】:Illegal attempt to establish a relationship 'userInfo' between objects in different contexts [duplicate]非法尝试在不同上下文中的对象之间建立关系“userInfo”[重复]
【发布时间】:2015-05-27 14:22:32
【问题描述】:

在创建两个对象之间的关系时,非法尝试在不同上下文中的对象之间建立关系“userInfo”。但是他们有共同的持久协调者和相同的上下文。请帮我找出问题。

- (void)parser:(NSDictionary *)attributeDict
{

    NSEntityDescription *ent = [NSEntityDescription entityForName:@"ThreadInfo" inManagedObjectContext:self.managedObjectContext];
    // create an ThreadInfo managed object, but don't insert it in our moc yet
    ThreadInfo *info = [[ThreadInfo alloc] initWithEntity:ent insertIntoManagedObjectContext:nil];
    self.threadinfo = info;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = entity;

// narrow the fetch to these two properties
NSPredicate *threadPredicate = [NSPredicate predicateWithFormat:@"userEmail == %@",[attributeDict valueForKey:@"userEmail"]];
[fetchRequest setPredicate:threadPredicate];

NSError *error = nil;

NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

for (UserInfo *info in fetchedItems)


{


            if([[attributeDict allKeys] containsObject:@"userEmail"])
            {
                if([attributeDict valueForKey:@"userEmail"]!=[NSNull null])
                {
                    self.threadinfo.userEmail=[attributeDict valueForKey:@"userEmail"];
                }
            }

            if([[attributeDict allKeys] containsObject:@"thread"])
            {
                if([attributeDict valueForKey:@"thread"]!=[NSNull null])
                {
                    self.threadinfo.threadID=[attributeDict valueForKey:@"thread"];
                }
            }
   if(info!=nil)
    {
        self.threadinfo.userInfo=info;// **CRASH HAPPENED AT THIS LINE**
        [info addThreadDetailsObject:self.threadinfo];
    }


          ThreadInfo *tInfo = nil;

         [self.managedObjectContext insertObject:tInfo];

        if ([self.managedObjectContext hasChanges]) {

        if (![self.managedObjectContext save:&error]) {

            NSLog(@"Unresolved error %@", error);
            abort();
        }


}

.h

@interface batchSave : NSOperation
@property (nonatomic, strong) ThreadInfo *threadinfo;
@property (nonatomic, strong) UserInfo *userInfos;

崩溃

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Illegal attempt to establish a relationship 'userInfo' between objects in different contexts source = <ThreadInfo: 0x17dd8280> (entity: ThreadInfo; id: 0x17dda6a0 <x-coredata:///ThreadInfo/t908A5944-FCD9-422B-80D7-83B71D243FB52> 

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    ThreadInfo 有一个 nil 上下文,基于您对 -initWithEntity: insertIntoManagedObjectContext: 的使用,您应该在此处传递一个上下文。

    另外,您不应该使用-initWithEntity: insertIntoManagedObjectContext:。建议您使用类方法+[NSEntityDescription insertNewObjectForEntityForName: inManagedObjectContext:],并且您不应将nil 传递给上下文。

    更新

    您的代码仍然没有意义。

    -init... 无缘无故地使用 nil 上下文的 ThreadInfo,然后在稍后针对名为 tInfonil 引用调用 -insertObject:

    如果这是你的实际代码,那么它有很多错误,我什至很难跟踪你正在尝试做什么。

    就目前而言,您创建的 ThreadInfo 实体没有上下文。那是导致错误的原因。

    1. 停止使用-initWithEntity: insertNewObjectForEntityForName:,使用我推荐的方法。
    2. 不要使用-insertObject:,如果立即传递上下文是多余的。

      self.threadinfo.userInfo=info;// **CRASH HAPPENED AT THIS LINE**
      [info addThreadDetailsObject:self.threadinfo];
      

    假设你有一个适当的双向关系,这些线做的事情完全相同,你不需要两者。

    为什么将threadinfo 存储为实例属性?看起来它应该只是一个局部变量。

    更改您的-init... 即可解决崩溃问题。但是您在此代码中还有其他问题。

    【讨论】:

    • 我试过了但是我在数据库保存中止()中遇到了崩溃,保存错误,代码更新
    • 使用此修复程序时我的数据也未保存到数据库。
    • if ([self.managedObjectContext hasChanges]) { if (![self.managedObjectContext save:&amp;error]) { NSLog(@"Unresolved error %@", error); abort(); } 此代码仅在原始代码中多次插入 managedobjectcontext 之后出现。我试图实现批量保存。但是这个错误不允许我进行批量保存。
    猜你喜欢
    • 2011-08-31
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多