InsertNewObjectForEntityForName:
Я настроил Entity с помощью редактора файлов Xcode.xcdatamodel. Я создал объект под названием Person, добавил несколько атрибутов, а затем сгенерировал файл .m для его представления. Все работает отлично.
Теперь, когда я перехожу к написанию строки кода, например:
Person * person = (Person*)[NSEntityDescription
insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:managedObjectContext];
И я получаю:
Завершение приложения из-за неотображенного исключения "NSInternalInconsistencyException", причина: "+ entityForName: не удалось найти NSManagedObjectModel для имени сущности" Человек "
Я следовал примеру местоположения, хотя, по-моему, шаг за шагом, но я думаю, что, должно быть, я пропустил какой-то важный шаг регистрации, в котором я рассказываю Xcode о том, что мой объект Person должен быть доступен. Также я сделал У меня есть способ "инициализировать" managedObjectContext вообще, пример местоположения тоже не работает.
Ответы
Ответ 1
Тот факт, что вы не настроили MOC, почти наверняка является проблемой. В частности, это означает, что вы, вероятно, не загружаете свою MOM (управляемую объектную модель), которая определяет Person. Где-то в вашем коде вы должны иметь что-то вроде этого:
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
И что-то вроде этого:
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
И что-то вроде этого:
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
Я просто копирую строки из AppDelegate шаблона основных данных (что вы получаете, если создаете новое приложение, использующее основные данные).
Если у вас есть все это, убедитесь, что ваш xcdatamodel указан на шаге Compile Sources сборки. И, конечно же, убедитесь, что Person на самом деле является именем Entity в вашем xcdatamodel. Имя сущности не совпадает с классом, хотя они часто устанавливаются одинаковыми.
Ответ 2
Вам нужна инициализация основных данных
-(void)initCoreData{
NSError *error;
//Path to sqlite file.
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Level4.sqlite"];
NSURL *url = [NSURL fileURLWithPath:path];
//init the model
NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
//Establish the persistent store coordinator
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]){
NSLog(@"Error %@",[error localizedDescription]);
}else{
self.context = [[[NSManagedObjectContext alloc ] init ] autorelease];
[self.context setPersistentStoreCoordinator:persistentStoreCoordinator];
}
[persistentStoreCoordinator release];
}
Ответ 3
Вы должны проверить, нет ли объекта NSManagedObjectContext.
например.
if (self.managedObjectContext == nil) {
NSLog(@"NSManagedObjectContext is nil");
return nil;
}