我有一个完美运行的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方法的特殊类的一部分
答案 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;
}