managedObjectContext是零

我正在尝试将Core Data添加到现有项目。 我有:

1)添加了Core Data框架2)将访问器和属性添加到AppDelegate 3)创build了数据模型文件

现在当我尝试调用NSManagedObjectContext *context = [self managedObjectContext]; 从视图控制器上下文是零和managedObjectContext永远不会触发。

这里是AppDelegate:

 #import "XXXAppDelegate.h" #import <CoreData/CoreData.h> @implementation XXXAppDelegate @synthesize window=_window; @synthesize navigationController=_navigationController; @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. // Add the navigation controller's view to the window and display. self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; return YES; } // Explicitly write Core Data accessors - (NSManagedObjectContext *) managedObjectContext { if (managedObjectContext != nil) { return managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext = [[NSManagedObjectContext alloc] init]; [managedObjectContext setPersistentStoreCoordinator: coordinator]; } return managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if (managedObjectModel != nil) { return managedObjectModel; } managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; return managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"<Project Name>.sqlite"]]; NSError *error = nil; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { /*Error for store creation should be handled in here*/ } return persistentStoreCoordinator; } - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; } @end 

编辑:这是我的视图控制器代码

 NSManagedObjectContext *context = [self managedObjectContext]; NSManagedObject *cardSet = [NSEntityDescription insertNewObjectForEntityForName:@"CardSet" inManagedObjectContext:context]; [cardSet setValue:@"Set 1" forKey:@"cardSetName"]; 

尝试添加这些条件来检查您的managedObjectContext是否nil或无论您想要使用它。 如果它的nilAppdelegate文件复制它。

  if (managedObjectContext == nil) { managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; NSLog(@"After managedObjectContext: %@", managedObjectContext); } 

假设你的属性被声明…你正在把它们综合到前面有下划线的ivars。 这是好事。 但是, 唯一要用下划线访问它们的地方是属性的getter / setter的实现。 不幸的是,这些都没有发生。 将其更改为…

 - (NSManagedObjectContext *) managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator: coordinator]; } return _managedObjectContext; } - (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } _managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; return _managedObjectModel; } - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"<Project Name>.sqlite"]]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { /*Error for store creation should be handled in here*/ } return _persistentStoreCoordinator; } 

如果你看看Xcode中的Master-Detail应用程序模板,你会发现它们像下面这样传递了AppDelegate中的ManagedObjectContext:

 #import "AppDelegate.h" #import "MasterViewController.h" @implementation AppDelegate @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; MasterViewController *controller = (MasterViewController *)navigationController.topViewController; NSLog(@"navigationController viewControllers: %@",[navigationController viewControllers]); NSLog(@"navigationController.topViewController: %@",navigationController.topViewController); controller.managedObjectContext = self.managedObjectContext; return YES; } 

如果你需要一个TabBarViewController在你的应用程序的前面,代码如下所示:

 #import "AppDelegate.h" #import "MasterViewController.h" @implementation AppDelegate @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator; - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. UITabBarController *tabController = (UITabBarController *)self.window.rootViewController; UINavigationController *navigationController = (UINavigationController *)[[tabController viewControllers] objectAtIndex:0]; MasterViewController *controller = (MasterViewController *)[[navigationController viewControllers] objectAtIndex:0]; controller.managedObjectContext = self.managedObjectContext; navigationController = (UINavigationController *)[[tabController viewControllers] objectAtIndex:1]; controller = (MasterViewController *)[[navigationController viewControllers] objectAtIndex:0]; controller.managedObjectContext = self.managedObjectContext; navigationController = (UINavigationController *)[[tabController viewControllers] objectAtIndex:2]; controller = (MasterViewController *)[[navigationController viewControllers] objectAtIndex:0]; controller.managedObjectContext = self.managedObjectContext; return YES; } 

我不知道你是如何在没有编译错误的情况下过去的,但是你的@synthesize使用了你的getters永远不能访问的下划线variables。 像这样做:

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

记下_managedObjectContext (带下划线)。 对managedObjectModelpersistentStoreCoordinator做同样的修复。