2

编辑:根据下面的(非常有帮助的)评论,经过进一步审查,我想补充一下(对于像我这样的其他新手)在使用 UIManagedDocument 获取核心数据功能时,请注意何时打开您的实例在您的应用程序中。我得到的错误是因为在设置我的获取结果控制器时我的托管对象上下文为 nil。在打开 UIManagedDocument 实例之后,我将设置获取的结果控制器的方法调用移动到了。这可能是非常基础的,对大多数人来说只是一个常识性问题,但是对于我们新手来说,当应用程序委托中没有设置核心数据时,我们需要了解文档必须处于可用状态才能使用可以设置fetchedResultsController。

我正在学习 Paul Hegarty 的斯坦福核心数据讲座,特别是“Photomania”应用程序的演示讲座。

我没有使用照片的 NSDictionaries,而是修改了应用程序以仅包含存储 NSStrings 的模型对象(例如,人名等)。这对我来说只是一个学习练习。

我相信我已经使用他的代码成功地重新创建了一个 UIManagedDocument,并通过以下两种方法将视图控制器的托管对象属性设置为文档的托管对象上下文的属性(它们是他的方法,当然不是我的)。

我将此代码放在将出现在屏幕上的 tableview 控制器中,以便我可以在 viewDidLoad 中测试托管对象上下文是否存在(它是他的 CoreDataTableViewController 类的子类)。这甚至是对托管对象上下文的有效测试吗?

我了解创建或打开 UIManagedDocument 的代码,但我不明白为什么托管对象上下文为 nil(如果我修改 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");
    }

}
4

0 回答 0