当尝试在第二个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];
}
答案 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"];