【问题标题】:core data application is Crashing in iphone device核心数据应用程序在 iphone 设备中崩溃
【发布时间】:2011-10-06 02:19:43
【问题描述】:

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

【问题讨论】:

  • 您的模型有多个版本还是只有一个?
  • 这两个例外是什么?从相关问题来看,这不是解决了问题吗?这对我来说似乎是一样的。
  • 首先是无法使用 nil 模型创建 nspersistancecordinator,其次是找不到实体城市

标签: iphone xcode core-data


【解决方案1】:

该错误实际上是由 self.managedObjectModel 属性具有 nil 值引起的。查看加载 managedObjectModel 的方法。这就是你问题的根源。

有时,Xcode 不会从模拟器或设备上的开发版本中删除以前版本的文件。解决方案是手动删除设备的整个应用程序并让 Xcode 从头开始​​重建它。

【讨论】:

  • 我尝试清理目标并重新安装应用程序,但无法正常工作
  • 手动,即不使用 Xcode,而是点击并按住应用程序图标,从设备上删除应用程序,然后重新安装。
【解决方案2】:

按住选项键,进入产品菜单(Xcode 4)并执行“清理构建文件夹”...然后松开选项键,执行“清理”...

现在执行产品菜单 > 分析并确保一切都是洁净的。

最后转到项目查看器的左侧面板,然后单击代表整个项目的图标。在主面板中出现的窗口中,在“目标”下,单击您的应用程序。现在单击“构建阶段”并展开“复制捆绑资源”。确保您的 TouristGuide.xcdatamodeld 文件在那里。接下来,展开“Link Binary with Libraries”并确保“CoreData.framework”在其中(如果您将 Core Data 添加到一个不是作为 Core Data 项目开始的现有项目,那么很可能,它不在那里)。接下来,展开“编译源”,当然,还要仔细检查所有模型类是否都在其中(你知道,NSManagedObject 自定义子类)。

说到那些模型类...现在点击您的 TouristGuide.xcdatamodeld 并点击“默认”配置。确保在“类”列中显示“NSManagedObject”的任何类都没有自定义类,如果它们确实列出了自定义类,请确保您具有与这些类对应的等效命名的 .h 和 .m 文件。

10-to-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”改成“mom”。

然后从设备或模拟器中删除应用程序,“清理构建文件夹”,“清理”,然后重新构建并重新运行项目。它可能会给您错误,也可能不会。之后,将其改回“momd”并重做所有这些步骤。更改此设置可能会使 XCode 删除比您执行“清理构建文件夹”并重新安装应用程序时更多的内容。这样,当您切换回来时,它会创建一个新的“momd”文件。

最后一招:

在您的标头中添加#import 也不会有什么坏处,只是为了祝您好运。 :D

希望这会有所帮助。如果有人在一开始就告诉我这些东西,那会为我节省很多时间。

【讨论】:

  • mom 文件是未版本化文件,momd 是版本化文件。
  • 正确; .momd 包含一个或多个 .mom 文件,对吗?但我希望暂时将文件类型更改为错误的文件类型可能会“混淆”Xcode 认为它必须重新构建它,如果它的构建方式存在问题,这可能会有所帮助。如果从设备上删除没有帮助的话,这是最后一搏的事情,因为我听说过它没有帮助的时候(比如设备越狱或者你没有构建版本)。
  • 我扩展了“复制捆绑资源”。并且没有 TouristGuide.xcdatamodeld 文件。我该如何添加这个
  • 绝对漂亮的答案!哇。突然,这个问题突然出现在我的发布版本上。原来我的 xcdatamodeld 不在 Copy Bundle Resources 中。然而,这个 bug 直到 xCode 6.3 才出现。我确定这一定是一个错误,因为自上次成功部署以来我找不到任何更改。无论如何,我吸取了教训,并将始终在发布版本上进行测试!感谢您的精彩帖子。
  • 不客气。我很高兴这个答案在 4 年后仍然对人们有所帮助。但不是很高兴苹果现在还没有让这个更加防弹...... CBA......就像所有优胜美地内核恐慌和滞后......叹息......
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多