- [NSURL initFileURLWithPath:]: ноль строковый параметр 'в NSManagedObjectModel - PullRequest
9 голосов
/ 11 июля 2010

Просто пытаюсь проникнуть в суть Core Data и сразу же попасть в тупик.В моем AppDelegate у меня есть следующий код:

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel_ != nil) {
        return managedObjectModel_;
    }
    NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"DataModel" ofType:@"momd"];
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
    managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return managedObjectModel_;
}

Где @ "DataModel" - это имя моего файла .xcdatamodel - это правильно?

Ответы [ 2 ]

12 голосов
/ 19 апреля 2011

Изменение "мама" на просто "мама" работало для меня.Ответ Маркуса С. Зарры также сработал для меня, как только я установил синтаксис:

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

, хотя я понятия не имею, что делает эта строка.

Редактировать: я провел еще несколько исследований, и яТеперь узнайте, что делает вышеприведенная строка и почему она работает / не работает.Приведенная выше строка будет искать в вашем проекте все модели и добавлять их в xcdatamodel.Это работает, если вы не используете версионные модели.Тем не менее, если в будущем вы переключитесь на использование версионных моделей, будут импортированы все версии модели, поэтому вы получите как старое, так и новое вместе, что НЕ то, что вам нужно.Таким образом, решение состоит в том, чтобы сделать одну из двух вещей.Если вы хотите использовать не версионную модель, используйте следующие строки для захвата модели:

NSString *modelPath = [[NSBundle mainBundle]
    pathForResource:@"DataModel" ofType:@"mom"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

Если вы хотите использовать версионную модель (рекомендуется), выберите модель и запустите Дизайн -> Модель данных -> Добавить версию модели из меню, чтобы создать версионную модель.Это автоматически изменит расширение вашей модели с xcdatamodel на xcdatamodeld.Как только это будет сделано, используйте следующие строки:

NSString *modelPath = [[NSBundle mainBundle]
    pathForResource:@"DataModel" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

Обратите внимание, что единственная разница заключается в изменении параметра ofType с @ "mom" на @ "momd".Я надеюсь, что это проясняет, что происходит для всех, кто пытается понять CoreData.D

9 голосов
/ 13 июля 2010

Часто проще изменить это на

managedObjectModel_ = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

Тогда, если это мама или мама, вы все равно получите модель обратно.

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