【问题标题】:Trouble adding Core Data to a Storyboard App将核心数据添加到 Storyboard 应用程序时遇到问题
【发布时间】:2013-04-30 18:11:36
【问题描述】:

向我的应用添加核心数据功能时遇到问题。

我不明白为什么managedObjectContext 总是为零(即使在我的 AppDelegate 中)。我知道我应该从模型中传递它,但不知道该怎么做。

我收到以下错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用,原因:“+entityForName: nil 不是搜索实体名称“Goal”的合法 NSManagedObjectContext 参数

g4tappDelegate.h

#import <UIKit/UIKit.h>
#import "Goal.h"
@class g4tPopPageViewController;

@interface g4tAppDelegate : UIResponder <UIApplicationDelegate> {

    NSManagedObjectModel *managedObjectModel;
    NSManagedObjectContext *managedObjectContext;
    NSPersistentStoreCoordinator *persistentStoreCoordinator;

    UIWindow *window;

}

- (NSManagedObjectContext *)managedObjectContext;

@property (strong, nonatomic) UIWindow *window;

@property (strong, nonatomic) g4tPopPageViewController *PopPageViewController;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@end

g4tappDelegate.m

#import "g4tAppDelegate.h"
    #import "g4tPopPageViewController.h"
    #import "Goal.h"

    @implementation g4tAppDelegate
    NSManagedObjectContext *managedObjectContext;

    @synthesize PopPageViewController;
    @synthesize managedObjectContext = _managedObjectContext;
    @synthesize managedObjectModel = _managedObjectModel;
    @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        NSManagedObject *newGoal;
//ERROR HERE
        newGoal = [NSEntityDescription 
                   insertNewObjectForEntityForName:@"Goal"
                   inManagedObjectContext:_managedObjectContext];

        PopPageViewController.managedObjectContext = self.managedObjectContext;

        UIStoryboard*  sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
        UIViewController* vc = [sb instantiateViewControllerWithIdentifier:@"AddGoal"];

        UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc];

        [self.window setRootViewController:navigationController];
        [self.window makeKeyAndVisible];
        // Override point for customization after application launch.

        return YES;
    }

【问题讨论】:

  • 你在哪里初始化_managedObjectContext
  • 持久存储在哪里?
  • 你有没有得到这个工作?如果是这样,请不要忘记将问题标记为已回答。 ;-)

标签: ios core-data


【解决方案1】:

首先初始化你的上下文。创建后首先将上下文传递给 viewController 实例。要么你错过了一些实现,要么你没有在这里发布。

另外,更正您的属性

@property (strong, nonatomic) PopPageViewController *g4tPopPageViewController;

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

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

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourStore.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];


    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
    }

    return _persistentStoreCoordinator;
}

// Then pass it to your other controller from your viewDidLoad
vc.managedObjectContext = _managedObjectContext;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多