iOS核心数据:在何处设置和加载数据库?

时间:2013-12-29 11:07:17

标签: ios core-data

我已经按照斯坦福大学的课程,现在在所有视图控制器中我基本上都使用这些设置功能:

- (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)setBudgetDatabase:(UIManagedDocument *)budgetDatabase
{
    if(_budgetDatabase != budgetDatabase){
        _budgetDatabase = budgetDatabase;
        [self useDocument];
    }
}

我现在已经看到了几个示例项目,他们在appdelegate.m初始化整个coredata的东西(到目前为止我几乎不能使用,我必须承认)并且想知道我在Standford课程中学到的方法是否正确?或者如果我误解了?我应该在app delegate中进行此设置吗?你知道一个解释这个的教程吗?对于更大的应用程序,我还没有找到解释这个的东西......

1 个答案:

答案 0 :(得分:1)

由于 rmonjo 建议与NSFetchedResultsController相关的内容应保留在控制器类中。例如,它可以保留在特定的UIViewController类,UITableViewController类或其他类可以扩展的类中(即基类UIViewController类)。

关于与设置和加载相关的代码,我通常将该代码留在app委托中,或者我创建一个特定的单例类(只是从NSObject扩展),可以在任何地方访问。

您可以在NSScreencast Core Data Basics看到有用的方法。显然,这种方法可以根据您的需求进行定制。

希望它有所帮助。