初始化核心数据managedObjectcontext

时间:2013-06-25 16:24:09

标签: ios core-data singleton

我使用单例数据控制器从两个不同的视图调用核心数据函数:创建视图和历史视图。

第一个视图只是创建或查看历史记录按钮以转到相应的视图。

我的问题是我必须完成我的创建过程(在创建视图中按创建护理)以从历史记录视图中的Core数据接收任何内容。因此,我假设我必须启动我的managedObjectContext。或者我是否需要初始化其他核心数据元素?

我在appDelegate中初始化dataControllerSingelton。但是,我无法弄清楚如何在单个init方法中初始化托管对象上下文:

+(DataControllerSingleton *)singleDataController{

static DataControllerSingleton * single=nil;

@synchronized(self)
{
    if(!single)
    {
        single = [[DataControllerSingleton alloc] init];
        single.masterCareList = [[NSMutableArray alloc]init];

        //NSManagedObjectContext *managedObjectContext = [[DataControllerSingleton singleDataController] managedObjectContext]; - This lame attempted does not work


    }

}
return single; }

我在singletonDataController.m中的managedObjectContext方法:

 - (NSManagedObjectContext *)managedObjectContext
 {
if (_managedObjectContext != nil) {
    return _managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}

运行此创建Care方法后,它可以正常工作:

- (void)insertNewObject:(Care *)care{


NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];

NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];

NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:    
[entity name] inManagedObjectContext:self.managedObjectContext];

NSString *fileName = care.pictureURL;
NSString *text = care.causeText;
NSDate  *date = care.date;
NSData  *imgData = care.imageData;

[newManagedObject setValue:fileName forKey:@"urlPath"];
[newManagedObject setValue:text forKey:@"name"];
[newManagedObject setValue:date forKey:@"date"];
[newManagedObject setValue:imgData forKey:@"imageData"];

 // Save the context.
[self saveContext]; 
}

任何反馈或提示都很有帮助,我非常感谢详细的代码!

1 个答案:

答案 0 :(得分:2)

你很好,这应该有效。您正在懒惰地正确创建托管对象上下文,因此如果它还没有创建,它应该被创建。

我认为你的单身人士绝对是矫枉过正。使用Apple样板初始化应用程序委托中的核心数据堆栈然后只为视图控制器提供简单的managedObjectContext属性是有意义的。

很简单,Apple有很多像这样的示例项目。除非您与iCloud异步同步,否则您对单例没有任何用处。