1

当尝试在第二个 NSManagedObjectContext 中添加核心数据对象时,我收到一条错误消息,指出非法尝试在不同上下文中的对象之间建立关系“信息”。但是,这两个实体位于相同的上下文中(至少,它们应该)。调试器给出相同的十六进制数。这段代码有什么问题?

-(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];
}
4

3 回答 3

1

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

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

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

于 2012-12-06T13:01:40.100 回答
0

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

于 2012-10-01T14:19:52.897 回答
0

很难从您的代码示例中分辨出来,但根据您的崩溃信息,您的infoMO对象来自另一个上下文。您不能在来自不同上下文的两个对象之间创建关系。

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

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

Info *contextInfoMO = [context objectWithID:infoMO.objectID];
[newHistory setValue:contextInfoMO forKey:@"info"];
于 2012-10-01T16:37:01.523 回答