【问题标题】:Default Context is nil! Did you forget to initialize the Core Data Stack? [MagicalRecord]默认上下文为零!你忘记初始化核心数据栈了吗? [魔法记录]
【发布时间】:2014-10-01 23:16:39
【问题描述】:

我是第一次使用 MagicalRecord。

我是这样设置的:

[MagicalRecord setupCoreDataStackWithStoreNamed:@"test"];

其中 test 是我的核心数据文件 ( 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 生成的核心数据类。

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

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

【问题讨论】:

  • 你有没有把设置放在AppDelegate.mapplication:didFinishLaunchingWithOptions
  • 是的,我将使用 AppDelegate 编辑我的问题。
  • 你用错了。 DataModel != 持久存储
  • 我不明白有什么问题?我只是按照这个教程raywenderlich.com/56879/magicalrecord-tutorial-ios
  • 控制台中还有其他消息吗?如果您打破堆栈设置代码并单步执行,一切看起来都不错吗?你的模型有正确的名字吗?

标签: ios objective-c core-data magicalrecord


【解决方案1】:

你做事的顺序不对。根视图控制器的viewDidLoad 将在您的核心数据设置代码之前被调用,因为您会立即将其添加到窗口中。将神奇的记录设置移动到应用程序委托方法的顶部。

【讨论】:

  • 非常感谢。在教程中他们说把它放在返回是的之前。从来没有想过流程。
  • 教程使用storyboards,流程不一样
【解决方案2】:

对于遇到此问题的任何人,标记的答案都是正确的,但在我的情况下,这是由于根 tabBarController 的视图控制器之一具有通过核心数据获取初始化的属性,并且此初始化是在著名的 ApplicationDidfinishLaunchingWithOptions 方法之前调用的。一个简单的解决方法是让它变得惰性,以便在调用属性之前不会调用初始化。

private var lists = MyCoreDataModelClass().someMethodFetchingStuff()

变成

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

(顺便说一句,我可以将 MyCoreDataModelClass 实例存储在另一个属性中,这样我就不会在每次需要时都对其进行初始化)

【讨论】:

    猜你喜欢
    • 2017-04-01
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2014-12-29
    相关资源
    最近更新 更多