1

我正在尝试解析 XML 文档并将其数据存储在使用后台队列的核心数据存储中。我正在使用 iOS 5 中引入的新的嵌套 UIManagedObjectContext 概念。

我为我的 NSManagedObject 公司添加了一个新类别,该类别处理公司特定数据的解析:

- (void)parseAttributesFrom:(NSString*)xmlStr 
             inManagedObjectContext:(NSManagedObjectContext*)managedObjectContext 
  {
  NSManagedObjectContext * context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];

  context.parentContext = self.managedObjectContext;
  [context performBlock:^{

                IBCompany *company = self;
                [company setValue:[[[document.root childNamed:@"CoIDs"] childWithAttribute:@"Type" value:@"CompanyName"] value] forKey:@"companyName"];
            ...

这就是我调用此方法的方式:[company parseAttributesFrom:xmlStr inManagedObjectContext:self.managedDocument.managedObjectContext]; 请注意,我的问题没有改变,即使我将托管对象上下文作为参数传递给该方法。

当我运行代码时,它会在我设置公司的年度期间崩溃,并显示错误消息 NSInvalidArgumentException: 'Illegal attempt to establish a relationship 'company' between objects in different contexts (source = <IBEstPeriod: ...

IBEstPeriod *annualPeriod = [NSEntityDescription insertNewObjectForEntityForName:@"IBEstPeriod" inManagedObjectContext:context];
[annualPeriod setCompany:company];

当代码以相同的背景思想运行时,我很难理解为什么错误应该与不同的上下文相关。我将不胜感激任何帮助!!

4

2 回答 2

1

我认为,原因在于IBCompany *company = self;context通过了,然后你在另一个上下文中设置了新的连接。

这就是原因。

于 2012-06-24T21:46:51.780 回答
1

你不能这样做:

context.parentContext = self.managedObjectContext;

如果您在此处使用 UIManagedDocument:

[company parseAttributesFrom:xmlStr inManagedObjectContext:self.managedDocument.managedObjectContext];

这是因为 UIManagedDocument 已经使用了嵌套上下文,并且 self.managedDocument.managedObjectContext 已经设置了它的父上下文。现在你正在把它换掉,这样做你会破坏事情。

这是来自UIManagedDocument 类参考的引用。

为了支持异步数据写入,Core Data 实际上使用了一对嵌套的托管对象上下文。父上下文在私有线程上创建,子上下文在主线程上创建。您从 managedObjectContext 属性中获取子上下文。

于 2012-06-25T06:17:32.933 回答