Основные данные приложения сбой в устройстве iphone - PullRequest
4 голосов
/ 15 июля 2011

Здравствуйте, я тестирую свое основное приложение данных на устройстве, но оно выходит из строя на 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 ]

18 голосов
/ 15 июля 2011

Удерживая нажатой клавишу выбора, перейдите в меню Продукт (Xcode 4) и выполните «Очистить папку сборки» ... затем отпустите клавишу выбора и выполните «Очистку» ...

Теперь сделайте Меню продукта > Анализ и убедитесь, что все кошерно.

Наконец, перейдите на левую панель программы просмотра проекта и нажмите на значок, который представляет весь вашпроект.В появившемся окне на главной панели в разделе «Цели» щелкните свое приложение.Теперь нажмите «Фазы сборки» и разверните «Копировать ресурсы комплекта».Убедитесь, что ваш файл TouristGuide.xcdatamodeld находится там.Затем разверните «Связать двоичные файлы с библиотеками» и убедитесь, что там присутствует «CoreData.framework» (если вы добавили базовые данные в существующий проект, который не начинался как проект с базовыми данными, скорее всего, он нетам).Затем разверните «Источники компиляции» и, конечно же, дважды проверьте, что все классы вашей модели находятся там (знаете, пользовательские подклассы NSManagedObject).

Говоря об этих классах моделей ...Теперь нажмите на свой TouristGuide.xcdatamodeld и выберите конфигурацию «По умолчанию».Убедитесь, что у всех классов, в которых указано «NSManagedObject» в столбце «Класс», НЕТ пользовательских классов, и если в них есть список пользовательских классов, убедитесь, что у вас есть файлы с эквивалентным именем .h и .m, соответствующие им.

10-к-1 это как-то связано с самим файлом модели.Однажды я изменил полный путь к файлу моей модели (это должен быть /Users/You/Documents/Developer/MyApp/MyModel.xcdatamodeld/MyModel.xcdatamodel).После того, как я изменил его, я не мог понять, как изменить его обратно, потому что MyModel.xcdatamodeld - это «пакетный» файл, а не папка.Конечно, в искателе вы можете сделать «Показать содержимое пакета ...», но диалоговое окно XCode для выбора местоположения файла отказалось перемещаться в содержимое пакета!Так что я не смог когда-либо повторно выбрать файл .xcdatamodel, который находится в файле .xcdatamodeld!Мне пришлось полностью воссоздать весь файл модели с нуля, это была огромная боль.Может быть, есть способ сделать это, но я не мог понять это.

Кроме того, два последних трюка.

Первый последний трюк, попробуйте на всякий случай сделать резервную копию вашего проекта,но это сработало для меня, когда я застрял: измените свой код с этого:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"momd"];

на этот:

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TouristGuide" withExtension:@"mom"];

... измените «momd» на «mom».

Затем удалите приложение с устройства или симулятора, «Очистить папку сборки», «Очистить», перестроить и повторно запустить проект.Это может дать вам ошибки, а может и нет.После этого измените его обратно на «momd» и повторите все эти шаги.Изменение этого параметра может привести к тому, что XCode удалит больше материала, чем в противном случае, если вы выполните «Очистить папку сборки» и переустановите приложение.Таким образом, когда вы переключаетесь обратно, он создает новый файл "momd".

Второй последний трюк:

Также никогда не помешает #import в ваших заголовках, просто на удачу.: D

Надеюсь, это поможет.Если бы кто-то сказал мне это сначала, это сэкономило бы мне много времени.

1 голос
/ 15 июля 2011

Ошибка на самом деле вызвана тем, что свойство self.managedObjectModel имеет значение nil. Посмотрите на метод, куда загружается managedObjectModel. Это источник вашей проблемы.

Иногда XCode не удаляет предыдущие версии файлов из сборок разработки на симуляторе или устройстве. Решение состоит в том, чтобы вручную удалить все приложение устройства и заставить XCode восстановить его с нуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...