默认上下文为零!您是否忘记初始化核心数据堆栈? [MagicalRecord]

时间:2014-08-08 12:58:54

标签: ios objective-c core-data magicalrecord

我第一次使用MagicalRecord。

我已经设置了这样:

[MagicalRecord setupCoreDataStackWithStoreNamed:@"test"];

其中test是我的Core数据文件的文件名(test.xcdatamodeld)。

在我想要使用核心数据的视图控制器中,我写了这个:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // If there is no POI, create a new POI
    if (!_poi) {
        _poi = [POI MR_createEntity];
    }
    // If there is no POI rank(=category) create one
    if (!_poi.rank) {
        _poi.rank = [Rank MR_createEntity];
    }
}

我在哪里

@Class POI; 
头文件中的

。 POI和Rank是我的xCode生成的coredata类。

当我运行时:我总是得到:

2014-08-08 14:52:05.509 test[41248:60b] *** Assertion failure in +[NSManagedObjectContext MR_defaultContext], /Users/x/Documents/xCode/test/test/Pods/MagicalRecord/MagicalRecord/Categories/NSManagedObjectContext/NSManagedObjectContext+MagicalRecord.m:60
2014-08-08 14:52:05.512 test[41248:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Default Context is nil! Did you forget to initialize the Core Data Stack?'

这发生在我的ViewController初始化之后。

有人可以帮助我吗?

编辑:

我是通过Cocoapods安装的:

Pod 'MagicalRecord'

我的Appdelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Setup Reliant
    [self _reliantInit];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[UINavigationController alloc]initWithRootViewController:[[HomeViewController alloc]init]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    //Setup MagicalRecord
    [MagicalRecord setupCoreDataStackWithStoreNamed:@"test"];

    return YES;
}

2 个答案:

答案 0 :(得分:13)

你以错误的顺序做事。在您的核心数据设置代码之前,将调用根视图控制器的viewDidLoad,因为您可以立即将其添加到窗口中。将魔法记录设置移动到app delegate方法的顶部。

答案 1 :(得分:1)

对于遇到此问题的人来说,标记的答案是正确的,但在我的情况下,这是由于根tabBarController的一个视图控制器具有通过核心数据提取初始化的属性,并且在初始化之前调用此初始化着名的ApplicationDidfinishLaunchingWithOptions方法。一个简单的解决方法是使其变得懒惰,因此在调用该属性之前不会调用初始化。

private var lists = MyCoreDataModelClass().someMethodFetchingStuff()

变为

private lazy var lists = MyCoreDataModelClass(). someMethodFetchingStuff()

(顺便说一句,现在它很懒,我可以将MyCoreDataModelClass实例存储在另一个属性中,所以每次我需要时都不会初始化它)