2012-04-10 14 views
3

私は既存のプロジェクトにコアデータを追加しようとしています。私がしました:managedObjectContextはゼロです

1) 2)私はビューから NSManagedObjectContext *context = [self managedObjectContext]; を呼び出すしようとすると、今、データモデルファイル

を作成AppDelegate 3)にアクセサとプロパティを追加したコアデータのフレームワークを追加しましたコントローラはコンテキストがnilであり、managedObjectContextは決して起動しません。

#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の使用アンダースコアここ

はAppDelegateですgetterが決してアクセスしない変数。

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

+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

あなたのプロパティが宣言されていると仮定します。あなたはそれらをアンダースコアの前にアンダースコアで合成しています。それはいいことだ。ただし、にアクセスする場合は、そのプロパティの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でのマスター・ディテール・アプリケーションのテンプレートを見れば、あなたは彼らがこのよう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; 
} 
関連する問題