编辑:根据下面的(非常有用的)评论,经过进一步审核,我只想添加(对于像我这样的其他新手),当使用UIManagedDocument获取核心数据功能时,请注意在您的应用中打开您的实例时。 我得到的错误是因为我的托管结果控制器设置时我的托管对象上下文为零。我在调用UIManagedDocument实例之后移动了设置获取结果控制器的方法调用。 它可能是非常基本的,对大多数人来说只是一个常识问题,但对于我们新手来说,当核心数据没有在应用程序委托中设置时,我们需要知道文档必须在我们之前处于可用状态可以设置fetchedResultsController。
我正在完成Paul Hegarty关于核心数据的斯坦福大学讲座,特别是“Photomania”应用程序的演示讲座。
我没有使用照片的NSDictionaries,而是将应用程序修改为只包含存储NSStrings的Model对象(例如,一个人的名字等)。这只是我的学习练习。
我相信我已成功使用他的代码重新创建了一个UIManagedDocument,并通过以下两种方法将视图控制器的托管对象属性设置为文档管理对象上下文的属性(当然,这是他的方法,而不是我的方法)
我把这段代码放在一个将出现在屏幕上的tableview控制器中,这样我就可以在viewDidLoad中测试托管对象上下文是否存在(它是他的CoreDataTableViewController类的子类)。这甚至是托管对象上下文的有效测试吗?
我理解创建或打开UIManagedDocument的代码,但我不明白为什么托管对象上下文为零(如果我修改viewDidLoad中的小测试,它会告诉我上下文是== nil)。
此时,没有任何内容写入上下文,我也没有包含任何获取的结果。
我将其分解为几个部分,因为我的演讲应用程序的简化版本一直给我一个错误,即托管对象上下文和获取结果控制器是零。
在这种情况下,我想测试一下,如果我在前进之前获得了有效的托管对象上下文。我有一种强烈的感觉,我在基本上复制的代码(用于学习目的)中缺少一些基本的信息。
有谁知道为什么托管对象上下文为零?或者应该是这样的,因为我在设置时错过了什么?或者当我将UIManagedDocument的上下文设置为表视图控制器的(自我)上下文时?
非常感谢任何信息。
-(void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
_managedObjectContext = managedObjectContext;
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (!self.managedObjectContext) [self useDemoDocument];
}
-(void)useDemoDocument
{
NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
url = [url URLByAppendingPathComponent:@"Demo Document"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];
if (![[NSFileManager defaultManager] fileExistsAtPath:[url path]]) {
//create it
[ document saveToURL:url
forSaveOperation:UIDocumentSaveForCreating
completionHandler:^(BOOL success) {
if (success) {
self.managedObjectContext = document.managedObjectContext;
}
}];
} else if (document.documentState == UIDocumentStateClosed){
//open it
[document openWithCompletionHandler:^(BOOL success) {
if (success) {
self.managedObjectContext = document.managedObjectContext;
}
}];
} else {
//try to use it
self.managedObjectContext = document.managedObjectContext;
}
}
-(void)viewDidLoad
{
if (self.managedObjectContext) {
NSLog(@"there is a managed object context");
}
}