2012-04-10 60 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; 
} 
相關問題