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;
}