无法使用nil模型错误创建NSPersistentStoreCoordinator

时间:2012-01-10 14:06:49

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

我有一个完美运行的coreData datamodel文件。由于一些特殊要求,我删除了旧的datamodel文件,并使用完全相同的实体创建了另一个数据模型文件。来自先前dataModel的实体没有变化。我已将此作为不同的包的一部分,并从该包中引用它。

用于创建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_;

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

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

3 个答案:

答案 0 :(得分:6)

首先验证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在您下次构建时生成新文件。

答案 1 :(得分:1)

实际问题结果是内存问题。我没有使用AppDelegate的核心数据对象,我在其他一些类中创建它们。但是我没有发布这些对象,因为这些对象发生了巨大的泄漏并且应用程序崩溃了。我发布了核心数据对象,现在我的应用程序工作正常......

答案 2 :(得分:0)

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

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;

}