2012-04-10 56 views
3

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

1)添加的Core Data框架 2)的添加存取和属性到AppDelegate中 3)创建数据模型文件

现在,当我试图从一个视图调用 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"]; 
+1

你从哪里得到'managedObjectContext' nil?在Appdelegate.m或其他类中? – 2012-04-10 04:58:39

+0

在视图控制器 – hover 2012-04-10 18:55:55

回答

0

我不知道你是怎么过去没有编译器错误,但你的@synthesize的使用下划线'你的getters永远不会访问的变量。像这样做:

- (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做相同的修复。

+0

感谢您的答复。试过这个,但仍然没有运气。我已将视图控制器中的代码添加到上面的主文章中。 – hover 2012-04-10 19:46:14

+0

您是否尝试用断点调试代码以查看执行是否进入了您的getter? – 2012-04-11 03:19:54

+0

self.managedObjectContext不适合我。 _managedObjectContext工作。但我不知道如何。在我的AppDelegate.h文件中,我有一个属性managedObjectContext。 _managedObjectContext来自哪里? – 2013-06-04 10:39:47

1

尝试添加这些条件来检查您的managedObjectContext是否为nil或不在任何您想使用它的地方。如果其nilAppdelegate文件复制它。

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

假设您的属性被声明...您正在将它们综合到前面带有下划线的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; 
} 
1

如果你看一下在Xcode的主从应用程序模板你看到他们通过ManagedObjectContext在AppDelegate中是这样的:

#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; 
} 
相关问题