2012-04-10 3 views
3

Я пытаюсь добавить Core Data в существующий проект. Я:managedObjectContext is no

1) добавлены рамки Core Data 2) добавлены аксессоров и свойства к AppDelegate 3) создал модель данных файл

Теперь, когда я пытаюсь вызвать NSManagedObjectContext *context = [self managedObjectContext]; с точки зрения Контроллер контекст равен нулю, а управляемый объектObjectContext никогда не срабатывает.

Вот 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 

EDIT: вот мой взгляд контроллер код

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

Где вы получаете свой 'managedObjectContext' nil? В Appdelegate.m или в других классах? –

+0

Контроллер вида – hover

ответ

0

Я не знаю, как вы получили прошлое без ошибок компилятора, но ваш @synthesize S Использовать подчеркивание 'd, которые ваши получатели никогда не получают. Делают это так:

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

    return _managedObjectContext; 
} 

принять к сведению _managedObjectContext (с подчеркиванием). Сделайте те же исправления с managedObjectModel и persistentStoreCoordinator.

+0

Спасибо за ответ. Пробовал это, но все равно не повезло. Я добавил код в своем контроллере просмотра на главный пост выше. – hover

+0

Пробовал ли вы отлаживать свой код с помощью контрольных точек, чтобы увидеть, выполняется ли выполнение внутри ваших геттеров? –

+0

self.managedObjectContext не работал для меня. Работал _managedObjectContext. Но я не знаю, как это сделать. В моем файле AppDelegate.h у меня есть свойство managedObjectContext. Откуда появился _managedObjectContext? –

1

Попробуйте добавить это условие, чтобы проверить, есть ли managedObjectContextnil или нет, где вы хотите его использовать. Если его nil скопируйте его из файла Appdelegate.

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

Если вы посмотрите на шаблон приложения Master-Detail в 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; 
}