您好我正在设备中测试我的核心数据应用程序,但它在iphone中崩溃并且在模拟器中工作正常。这是我的代码..
- (NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"momd"];
managedObjectModel= [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSLog(@"%@", modelURL);
return managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"TouristGuide.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"TouristGuide" ofType:@"sqlite"];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}
NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
NSError *error;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Update to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
return persistentStoreCoordinator;
}
设备日志在行中显示异常:
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
例外情况为cannot create nspersistancecordinator with a nil model
,其次是cannot find Entity 'City'
。
我该如何解决这个问题?
崩溃日志
0x352d1de0 -[NSPersistentStoreCoordinator initWithManagedObjectModel:] + 252 10 TouristGuide
0x0000358e -[TouristGuideAppDelegate persistentStoreCoordinator] (TouristGuideAppDelegate.m:176) 11 TouristGuide
0x0000310e -[TouristGuideAppDelegate managedObjectContext] (TouristGuideAppDelegate.m:124) 12 TouristGuide
0x000041f6 -[CityViewController viewDidLoad] (CityViewController.m:43)
答案 0 :(得分:18)
按住选项键,转到产品菜单(Xcode 4)并执行“清理构建文件夹”...然后取消选项键,然后执行“清理”... < / p>
现在执行产品菜单&gt;分析并确保一切都是犹太人。
最后转到项目查看器的左侧面板,然后单击代表整个项目的图标。在主面板中显示的窗口中,在“目标”下,单击您的应用。现在单击“Build Phases”并展开“Copy Bundle Resources”。确保您的TouristGuide.xcdatamodeld文件存在。接下来,展开“Link Binary with Libraries”并确保“CoreData.framework”在那里(如果您将Core Data添加到一个现在的项目中,而这个项目并非作为Core Data项目开始,那么很可能,它不在那里)。接下来,展开“编译源代码”,当然,仔细检查所有模型类是否在那里(你知道,NSManagedObject自定义子类)。
说到那些模型类......现在点击您的TouristGuide.xcdatamodeld并点击“默认”配置。确保在“类”列中显示“NSManagedObject”的任何类都没有自定义类,如果它们列出了自定义类,请确保您具有与之对应的等效命名的.h和.m文件。
10比1它与您的模型文件本身有关。有一次我改变了我的模型文件的完整路径(它应该是/Users/You/Documents/Developer/MyApp/MyModel.xcdatamodeld/MyModel.xcdatamodel)。一旦我更改了它,我就无法弄清楚如何更改它,因为MyModel.xcdatamodeld是一个“包”文件,而不是文件夹。当然,在查找器中,您可以执行“显示包内容...”,但是XCode用于选择文件位置的对话框拒绝将导航到包内容中!所以我无法重新选择位于.xcdatamodeld文件中的.xcdatamodel文件!我不得不从头开始重新创建我的整个模型文件,这是一个巨大的痛苦。也许有办法做到这一点,但我无法理解。
另外,最后两个技巧。
最后一个技巧,为了以防万一,请在你的项目备份中尝试这个,但是当我遇到困难时它对我有用:从这里改变你的代码:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"momd"];
到此:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"mom"];
......将“妈妈”改为“妈妈”。
然后从设备或模拟器中删除应用程序,“清理构建文件夹”,“清理”,然后重建并重新运行项目。它可能会给你错误,也可能没有。之后,然后将其更改回“momd”并重做所有这些步骤。更改此项可能会使XCode删除比执行“清理构建文件夹”并重新安装应用程序时更多的内容。这样,当你切换回来时,它会制作一个新的“妈妈”文件。
最后一招:
为了好运,它也永远不会对你的标题中的#import造成伤害。 :d
希望这会有所帮助。如果有人在一开始就告诉我这些东西,那将为我节省很多时间。
答案 1 :(得分:1)
错误实际上是由具有nil值的self.managedObjectModel
属性引起的。查看加载managedObjectModel的方法。这是你问题的根源。
有时,Xcode不会从模拟器或设备上的开发版本中删除以前版本的文件。解决方案是手动删除设备的整个应用程序,让Xcode从头开始重建。