加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 01:46:42 所属栏目:百科 来源:网络整理
导读:您好我正在设备中测试我的核心数据应用程序,但它在iphone中崩溃并在模拟器中正常工作.这是我的代码.. - (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext != nil) { return managedObjectContext; } NSPersistentStoreCoordinato
您好我正在设备中测试我的核心数据应用程序,但它在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]];

例外情况是无法使用nil模型创建nspersistancecordinator,其次是无法找到实体“城市”.

我怎么解决这个问题?

崩溃日志

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)

解决方法

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

现在做产品菜单>分析并确保一切都是洁净的.

最后转到项目查看器的左侧面板,然后单击代表整个项目的图标.在主面板中显示的窗口中,在“目标”下,单击您的应用.现在单击“Build Phases”并展开“Copy Bundle Resources”.确保您的TouristGuide.xcdatamodeld文件存在.接下来,展开“使用库链接二进制文件”并确保“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

希望这可以帮助.如果有人在一开始就告诉我这些东西,那将节省我很多时间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读