新的“非法尝试在不同背景下的对象之间建立关系'xyz'”

时间:2012-10-01 13:29:16

标签: objective-c xcode core-data

当尝试在第二个NSManagedObjectContext中添加Core Data Objects时,我收到一条错误,指出非法尝试在不同上下文中的对象之间建立关系“info”。 但是,这两个实体处于相同的背景下(至少应该是这样)。 debuger给出相同的十六进制数。这段代码有什么问题?

-(void) loadHistoricalPrices
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// Create context on background thread
if(document!=NULL)
{
    NSManagedObjectContext *context = NULL;
    NSNotificationCenter *nc =NULL;

    context = [[NSManagedObjectContext alloc] init];
    [context setUndoManager:nil];
    [context setPersistentStoreCoordinator: [document.managedObjectContext persistentStoreCoordinator]];


    // Register context with the notification center
    nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(mergeChanges:)
               name:NSManagedObjectContextDidSaveNotification
             object:context];

    NSEntityDescription * infoEntity;
    infoEntity = [NSEntityDescription entityForName:@"Info" inManagedObjectContext:context];
    NSEntityDescription * historyEntity;
    historyEntity = [NSEntityDescription entityForName:@"History" inManagedObjectContext:context];



// fetching an object-array of info-entity, called result

    if([result count]>0)
    {

        NSArray * items;
       // getting items to insert into history-entity


        for(NSString * item in items)
        {
            NSArray * subs;
            subs=[item componentsSeparatedByString:@","];
            if([subs count]>5)
            {
                    HistoryMO * newHistory;

                    newHistory = [[[HistoryMO alloc] initWithEntity:historyEntity insertIntoManagedObjectContext:context] autorelease];
                    [newHistory setValue:[NSNumber numberWithDouble:[[subs objectAtIndex:4] doubleValue]] forKey:@"course"];
[newHistory setValue:infoMO forKey:@"info"];

// >>>>> CRASHES HERE

            }                
        }
    }


    // merge data
    if([[[context persistentStoreCoordinator] persistentStores] count]>0)
    {
        NSLog(@"saving...");

        error=NULL;
        [context save:&error];
        if (!error) [context reset]; else NSLog(@"error saving historic prices %@",[error localizedDescription]);
        if (!error) NSLog(@"saved successfully");
    }

    [nc removeObserver:self];
    [context release];
}
[pool release];
}

3 个答案:

答案 0 :(得分:1)

如果infoMO来自同一个上下文,则在以下行中调用[context reset]后,它将失效:

if (!error) [context reset]; else NSLog(@"error saving historic prices %@",[error localizedDescription]);

所以你需要重新获取它。这就是ChrisH的解决方案有效的原因。

答案 1 :(得分:0)

infoMO来自哪里?看起来你正在发表// getting items to insert into history-entity评论。我的猜测是你使用不同的上下文来获取这些对象。您必须使用相同的上下文来查找infoMO对象作为您用于插入HistoryMO的对象,否则上下文无法管理关系。

答案 2 :(得分:0)

很难从您的代码示例中看出,但根据您的崩溃信息,您的infoMO对象来自其他上下文。您无法在不同上下文中的两个对象之间创建关系。

最简单的解决方案是使用NSManagedObject的objectID属性在当前上下文中获取对infoMO的引用。

假设您的infoMO实例属于Info类,您可以这样做:

Info *contextInfoMO = [context objectWithID:infoMO.objectID];
[newHistory setValue:contextInfoMO forKey:@"info"];