iOS CoreData:如何设置核心数据“连接”?斯坦福UIDocument与Apple模板?

Mic*_*iZH 5 core-data objective-c ios uimanageddocument

我已经完成了斯坦福大学的课程,并按照讲座中的步骤设置了我的第一个应用程序和核心数据。大约是这样(我现在将代码转移到应用程序委托中):

- (void)setupFetchedResultsController
{
    NSError *error = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MainCategory"];
    request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"position" ascending:YES]];
    [self.budgetDatabase.managedObjectContext executeFetchRequest:request error:&error];

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request
                                                                       managedObjectContext:self.budgetDatabase.managedObjectContext
                                                                         sectionNameKeyPath:nil
                                                                                  cacheName:nil];
}

-(void)useDocument
{
    if(![[NSFileManager defaultManager]fileExistsAtPath:[self.budgetDatabase.fileURL path]]){
        [self.budgetDatabase saveToURL:self.budgetDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
            [self setupFetchedResultsController];
        }];
    } else if (self.budgetDatabase.documentState == UIDocumentStateClosed){
        [self.budgetDatabase openWithCompletionHandler:^(BOOL success){
            [self setupFetchedResultsController];
        }];
    } else if (self.budgetDatabase.documentState == UIDocumentStateNormal){
        [self setupFetchedResultsController];
    }
}

- (void)viewWillAppear:(BOOL)animated
{
    //Initialize database
    [super viewWillAppear:animated];
    if(!self.budgetDatabase){
        NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentationDirectory inDomains:NSUserDomainMask] lastObject];
        [url URLByAppendingPathComponent:@"BudgetDatabase"];
        self.budgetDatabase = [[UIManagedDocument alloc]initWithFileURL:url];
    }
}
Run Code Online (Sandbox Code Playgroud)

Apple模板中的代码(如果在创建Xcode项目时选中“ CoreData”,则看起来非常不同且更加复杂)。这有什么区别UIManagedDocument?有更好还是更坏?

Mar*_*les 0

我个人也按照UIDocument斯坦福课程的建议从上下文开始,这对于简单的应用程序很有好处,也是最简单的开始方法。当我的应用程序增长并且我需要访问整个应用程序的核心数据时,我必须处理用于在应用程序的不同生命阶段访问/打开/创建文档的额外代码。

然后我转向了 Apple 模板,对此我感到非常高兴。无论如何,一切都在appDelegate。我建议您阅读本文,以处理具有父子关系的后台线程上的核心数据Multi-Context CoreData