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

时间:2015-05-27 14:22:32

标签: ios core-data

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

....
<script>
        function validate(){
        var first = document.getElementById('first').innerHTML;
        var second = document.getElementById('second').value;
                    if (second == first){
                            alert('Ok!');
                    }
                    else {
                            alert('No!');
                    }
                    }

 </script>

·H

- (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();
        }


}

CRASH

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

1 个答案:

答案 0 :(得分:0)

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

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

更新

你的代码仍然没有意义。

-init...带有nil上下文的ThreadInfo无理由,然后针对名为-insertObject:的{​​{1}}引用调用nil

如果这是您的实际代码,则会出现大量错误,我甚至无法跟踪您要执行的操作。

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

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

    -insertObject:
  3. 假设你有一个正确的双向关系,这些线条做的完全相同,你不需要两者。

    为什么要将self.threadinfo.userInfo=info;// **CRASH HAPPENED AT THIS LINE** [info addThreadDetailsObject:self.threadinfo]; 存储为实例属性?看起来它应该只是一个局部变量。

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