核心数据应用程序是在iphone设备中崩溃

时间:2011-07-15 11:43:57

标签: iphone xcode core-data

您好我正在设备中测试我的核心数据应用程序,但它在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)

2 个答案:

答案 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从头开始重建。