Не удалось найти NSManagedObjectModel для имени объекта
Это код для метода toggleAddProject, код Core Data почти такой же, как в примере Apple CoreDataBooks, однако, когда я нажимаю кнопку добавления, приложение вылетает с entityForName: could not locate an NSManagedObjectModel for entity name 'Project'
в строке, начинающейся с newProjectController.project
-(IBAction)toggleAddProject
{
NewProjectViewController *newProjectController = [[[NewProjectViewController alloc] initWithStyle:UITableViewStyleGrouped] autorelease];
// Create a new managed object context for the new project -- set its persistent store coordinator to the same as that from the fetched results controller context.
NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
self.addingManagedObjectContext = addingContext;
[addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]];
newProjectController.project = (Project *)[NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:addingContext];
[addingContext release];
UINavigationController *addNewNavigationController = [[UINavigationController alloc] initWithRootViewController:newProjectController];
[self.navigationController presentModalViewController:addNewNavigationController animated:YES];
[addNewNavigationController release];
}
Все синтезировано, существует объект Project. Я не могу понять, почему он падает. Большинство людей, похоже, могут исправить эту ошибку, вставив следующий код либо в сам метод, либо в viewDidLoad:
if (managedObjectContext == nil)
{
managedObjectContext = [(CoreDataBooksAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
При изменении для моего делегата приложения это не имеет значения. Спасибо за любую помощь.
Ответы
Ответ 1
Эта ошибка имеет только несколько возможных источников:
- Типо в имени Entity.
- Объект контекстного объекта объекта Nil.
- Невозможность добавить модель, содержащую объект, в постоянное хранилище, которое использует контекст.
- Невозможность добавить правильный постоянный магазин в контекст.
Ответ 2
У меня была эта проблема, когда у меня было несколько разных NSManagedObjectContext
s. Быстрый способ его отладки состоял в том, чтобы проверить различные биты соединения и убедиться, что мой объект был указан перед вызовом контекста.
NSLog(@"Context: %@",context);
NSLog(@"PS Coord : %@",context.persistentStoreCoordinator);
NSLog(@"MOM : %@", context.persistentStoreCoordinator.managedObjectModel);
NSLog(@"Entities : %@",[[context.persistentStoreCoordinator.managedObjectModel entities] valueForKey:@"name"]);
Ответ 3
Используйте отладчик и убедитесь, что ваша модель не нуль. Это самая распространенная причина этой ошибки. Если это не nil, тогда найдите опечатку в имени сущности.
Ответ 4
Документы Apple дают хорошую информацию об отладке ошибки entityForName: could not locate an NSManagedObjectModel for entity name 'Foo'
.
Посмотрите этот раздел в Руководстве по программированию основных данных.
Ответ 5
Хорошо, я столкнулся с этой проблемой, и я решил ее таким образом. Исходный код был указан как:
Event *event = (Event *)[NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:managedObjectContext];
В то время как код является кратким, похоже, что отладчик не может отображать более подробную информацию о том, где ошибка, так как вы создаете и настраиваете новый экземпляр объекта "Событие" (или как бы то ни было, имя вашего Сущности).
Вместо этого я разбил это на три строки, и отладчик отобразил намного больше информации:
Event *event = [[NSManagedObject alloc] init];
NSManagedObjectContext *moc = [self managedObjectContext];
event = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:moc];
Я обнаружил, что не задал правильный тип для одного из атрибутов, и у меня была опечатка в моем коде, все из которых указывал отладчик.
Ответ 6
Во время моего развития я не смог найти объекты, которые я добавил позже.
Что сработало для меня: (В принципе, здравый смысл)
Удалите приложение каждый раз, когда вы меняете модель данных!
Модель данных кэшируется базовыми данными между установками, чтобы убедиться, что целостность остается в такте. Удалите приложение из симулятора /iPhone, чтобы проверить свои изменения.
PS: Кто-нибудь знает, как это сделать автоматически?
Ответ 7
TechZen - это место... в моем случае это было №4. Пройдите шаги в следующей ссылке, и это должно помочь вам добавить соответствующие методы CoreData в существующий проект и настроить все правильно, чтобы вы не столкнулись с имеющейся ошибкой.
Добавление основных данных в существующие проекты iPhone