2012-04-10 9 views
3

Ich versuche, Core-Daten zu einem vorhandenen Projekt hinzuzufügen. Ich habe:managedObjectContext ist null

1) hinzugefügt, um den Core Data Rahmen 2), um die Zugriffs- und Eigenschaften die AppDelegate hinzugefügt 3)

nun die Datenmodelldatei erstellt, wenn ich versuche NSManagedObjectContext *context = [self managedObjectContext]; aus einer Sicht zu nennen Controller der Kontext ist Null und der managedObjectContext wird nie ausgelöst. Hier

ist die 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: Hier ist meine Ansicht Controller-Code

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

Woher bekommen Sie Ihren 'managedObjectContext' nil? In Appdelegate.m oder in anderen Klassen? –

+0

In einer Ansicht Controller – hover

Antwort

0

Ich weiß nicht, wie Sie vorbei, ohne Compiler-Fehler erhalten, aber Ihre @synthesize s Nutzung Strich Variablen, auf die Ihre Getter niemals zugreifen. Machen Sie es wie folgt aus:

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

    return _managedObjectContext; 
} 

Beachten _managedObjectContext (mit Unterstrich). Führen Sie dieselben Korrekturen mit managedObjectModel und persistentStoreCoordinator durch.

+0

Danke für die Antwort. Versucht dies aber immer noch kein Glück. Ich habe den Code in meinem View-Controller zum obigen Hauptpost hinzugefügt. – hover

+0

Haben Sie versucht, Ihren Code mit Breakpoints zu debuggen, um zu sehen, ob die Ausführung überhaupt in Ihre Getter geht? –

+0

self.managedObjectContext funktionierte nicht für mich. _managedObjectContext hat funktioniert. Aber ich weiß nicht wie. In meiner AppDelegate.h-Datei habe ich eine Eigenschaft managedObjectContext. Woher kam _managedObjectContext? –

1

Versuchen Sie, diese Bedingung hinzuzufügen, um zu überprüfen, ob Ihre managedObjectContextnil ist oder nicht, wo immer Sie sie verwenden möchten. Wenn es nil kopiert es von Appdelegate Datei.

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

Angenommen, Ihre Eigenschaften werden deklariert ... Sie synthetisieren sie zu Ivars mit einem Unterstrich davor. Das ist gut. Die nur Stelle, auf die Sie mit dem Unterstrich zugreifen möchten, befindet sich jedoch in der Implementierung des Getter/Setter für die Eigenschaft. Leider passiert das in keiner von diesen. Ändern Sie ihn auf ...

- (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

Wenn Sie an der Master-Detail-Anwendungsvorlage aussehen in Xcode Sie sehen sie die ManagedObjectContext im AppDelegate wie dies passieren:

#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; 
} 

Wenn Sie eine TabBarViewController in Vor Ihrer App sieht der Code folgendermaßen aus:

#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; 
} 
Verwandte Themen