【问题标题】:Cannot create an NSPersistentStoreCoordinator with a nil model error无法使用 nil 模型错误创建 NSPersistentStoreCoordinator
【发布时间】:2012-02-06 22:32:47
【问题描述】:

我有一个运行良好的 coreData 数据模型文件。由于一些特殊要求,我删除了旧的数据模型文件并创建了另一个具有完全相同的实体的数据模型文件。与之前的数据模型相比,实体没有变化。我已将此作为不同捆绑包的一部分,并从该捆绑包中引用它。

创建 managedObjectModel 的代码

   if (managedObjectModel_ != nil) {
    return managedObjectModel_;
}
NSBundle *newBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"dataBundle" withExtension:@"bundle"]];   
NSString *modelPath = [newBundle pathForResource:@"DataHouse" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

return managedObjectModel_;

该应用程序一直运行良好,但突然(随机)我收到一条错误消息

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'
*** First throw call stack:`(0x62e052 0x26a9d0a 0xf6e86d 0x64fd 0x624e 0x381b 0x79c9b 0x65f2d 0x1881e0f 0x1882589 0x186ddfd 0x187c851 0x1827322 0x62fe72 0x160892d 0x1612827 0x1598fa7 0x159aea6 0x163437a 0x16341af 0x602966 0x602407 0x5657c0 0x564db4 0x564ccb 0x2791879 0x279193e 0x17e8a9b 0x28a2 0x2815)`

创建持久存储协调器的代码

 if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}

NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataHouse.sqlite"]];

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator_;

此错误发生在随机点,但每次运行应用程序时都非常一致。 在这一点上,我完全感到困惑和震惊……我在论坛上看到了同样的问题,但我想我的情况是特殊情况。我很确定上述代码 sn-p 中提到的 modelPath 变量在我每次打印时都会正常运行。

注意:上面的代码 sn-ps 不是 AppDelegate 类的一部分。它们是包含所有 Coredata 方法的特殊类的一部分

【问题讨论】:

  • 请包含您创建持久存储协调器的代码
  • jrturton:请用代码检查我更新的问题
  • 您需要使用调试器逐步完成它 - 在某个地方,您最终会发现模型没有被返回,但是没有任何东西跳出来,对不起!
  • 感谢兄弟的尝试..

标签: iphone ios core-data xcode4.2 core-data-migration


【解决方案1】:

首先验证 managedObjectModel_ 是否有效,您可以使用调试器或在其上调用方法

NSLog(@"%@", [managedObjectModel_ entities]);

验证您的数据模型是否正常。该调用应显示模型中所有实体的数组。接下来检查您的持久存储路径是否指向正确的位置。试试这个:

NSLog(@"%@", [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"DataHouse.sqlite"]);

最后(我认为这是需要做的,因为它发生在我身上)转到磁盘上存储 .sqlite 文件的位置:

~/Library/Application Support/iPhone Simulator/5.0/Applications/{your app id}/Documents

并删除 .sqlite 文件,以便 Core Data 在您下次构建时生成它。

【讨论】:

    【解决方案2】:

    实际问题原来是内存问题。我没有使用 AppDelegate 的核心数据对象,而是在其他一些类中创建它们。但是我没有释放这些对象,因为它们存在巨大的泄漏并且应用程序崩溃了。我发布了核心数据对象,现在我的应用程序运行良好......

    【讨论】:

    • @A for Alpha 我有完全相同的场景。我的应用程序有一个每 3 秒运行一次的线程。它将从核心数据中检索数据。但有时它会产生这个错误:Cannot create an NSPersistentStoreCoordinator with a nil model error。我只在 dealloc 函数中释放核心数据对象。我是否需要在每个线程实例中释放我的核心数据对象。
    【解决方案3】:

    如果您的数据模型名称是 Model.xcdatamodeid。只需将 URLForResource 参数替换为 AppDelegate.h 文件中的数据模型名称即可。

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];

    以下代码供参考。

    • (NSManagedObjectModel *)managedObjectModel {

      // 应用程序的托管对象模型。这是一个致命错误

    让应用程序无法找到并加载其模型。

    if (_managedObjectModel != nil) {
    
        return _managedObjectModel;
    
    }
    

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];

    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    return _managedObjectModel;
    

    }

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多