核心数据关系无法加载到一个关系

时间:2010-08-27 21:48:08

标签: iphone objective-c cocoa-touch core-data

我在文档和设置模型之间建立了一对一的关系:

alt text

创建文档时,会创建相应的“设置”对象。模型坚持核心数据。

在创建一些文档(以及关联设置)后重新启动时,应用程序会重新加载要使用的文档列表:

// Load delegate from shared application and context from delegate.
SampleAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = delegate.managedObjectContext;

// Create new request.
NSFetchRequest *request = [[NSFetchRequest alloc] init];

// Create entity description using delegate object context.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:context];

// Set entity for request.
[request setEntity:entity];

// Load array of documents.
NSError *error;
NSArray *documents = [context executeFetchRequest:request error:&error];

// Rlease descriptor.
[descriptor release];

// Release request.
[request release];

// Done.
return documents;

列表显示正常(文档正在加载)。但是,当试图访问程序退出的任何文档的设置时:

  

收到信号:“SIGABRT”。

当用户选择按钮时,将触发对设置的修改。奇怪的是,如果在加载文档之前添加以下代码片段(即如果在加载时访问关系),则程序不会崩溃:

for (Document *document in documents)
{
    NSLog(@"document.name: %@", document.name);
    NSLog(@"document.settings.stroke: %@", document.settings.stroke);
    NSLog(@"document.settings.stroke: %@", document.settings.stroke);
}

关系的属性是“(非原子,保留)”并使用“@dynamic”。有任何想法吗?谢谢!

2 个答案:

答案 0 :(得分:0)

在您的核心数据模型中,您是否在Document&amp ;;之间建立了反比关系?设置?如果没有,你必须。

答案 1 :(得分:0)

在这个bug上花了太多时间之后,我终于明白了。在初始加载值期间,我设置了KVO。此代码导致崩溃崩溃(尽管它们直到下一个运行循环才出现):

[self.document.settings addObserver:self forKeyPath:@"fill" options:0 context:NULL];
[self.document.settings addObserver:self forKeyPath:@"stroke" options:0 context:NULL];

不确定为什么这是一个问题,但我很幸运能够暂时删除它。