Почему NSManagedObjectContext = nil после первой попытки получить его? - PullRequest
1 голос
/ 12 марта 2011

У меня есть NSOutlineView с пользовательским NSOutlineViewDataSource на основе отношения родитель-потомок или двумя базовыми данными сущностями.

Я не нашел простого способа привязкиэто пока что так, пока что я выясняю, как сказать NSOutlineView обновить после того, как я вставлю новый объект в любую из сущностей и их соответствующие NSArrayControllers.

NSOutlineViewзаполняется нормально на awakeFromNib с помощью:

rootNode = [[IFParentNode alloc] initWithTitle:@"Root" children:nil];
    NSInteger clientCounter;
    clientCounter = 0;
    NSFetchRequest *clientsFetchRequest = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *clientsMoc= [clientsController managedObjectContext];
    NSEntityDescription *clientsEntity = [NSEntityDescription entityForName:@"Clients" inManagedObjectContext:clientsMoc];
    [clientsFetchRequest setEntity:clientsEntity];
    //sort
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"clientCompany" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [clientsFetchRequest setSortDescriptors:sortDescriptors];
    NSError *clientsFetchError = nil;
    clientsArray = [clientsMoc executeFetchRequest:clientsFetchRequest error:&clientsFetchError];
    [clientsFetchRequest release];

    NSInteger projectCounter;
    projectCounter = 0;
    NSFetchRequest *projectsFetchRequest = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *projectsMoc= [projectsController managedObjectContext];
    NSEntityDescription *projectsEntity = [NSEntityDescription entityForName:@"Projects" inManagedObjectContext:projectsMoc];
    [projectsFetchRequest setEntity:projectsEntity];
    NSError *projectsFetchError = nil;
    projectsArray = [projectsMoc executeFetchRequest:projectsFetchRequest error:&projectsFetchError];
    [projectsFetchRequest release];

    for (NSString *s in clientsArray) {
        NSManagedObject *clientMo = [clientsArray objectAtIndex:clientCounter];  // assuming that array is not empty
        id clientValue = [clientMo valueForKey:@"clientCompany"];
        //NSLog(@"Company is %@", parentValue);

        IFParentNode *tempNode = [[IFParentNode alloc] initWithTitle:[NSString stringWithFormat:@"%@", clientValue] children:nil];

        clientCounter = clientCounter + 1;
        [rootNode addChild:tempNode];
        [tempNode release];
    }

    for (NSString *s in projectsArray) {
        NSInteger viewNodeIndex;
        viewNodeIndex = 0;
        NSManagedObject *projectMo = [projectsArray objectAtIndex:projectCounter];  // assuming that array is not empty
        id projectValue = [projectMo valueForKey:@"projectTitle"];
        id projectParent = [[projectMo valueForKey:@"projectParent"] valueForKey: @"clientCompany"];
        // find if theres an item with the projetParent name
        id nodeTitle = [[rootNode children] valueForKey:@"title"];
        for(NSString *companies in nodeTitle) {
            if([companies compare:projectParent] == NSOrderedSame) {
                //NSLog(@"Yeh! Company is %@ and parent is %@ and id is: %d", companies, projectParent, viewNodeIndex);
                // then assign that node to be the tempnode.
                IFParentNode *tempNode = [rootNode.children objectAtIndex:viewNodeIndex];
                IFChildNode *subTempNode = [[IFChildNode alloc] initWithTitle:[NSString stringWithFormat:@"%@", projectValue]];
                [tempNode addChild:subTempNode];
                [subTempNode release];
                [tempNode release];
            } else {
                // do nothing.
            }
            viewNodeIndex = viewNodeIndex + 1;
        }
        projectCounter = projectCounter + 1;
    }

    [outlineView expandItem:nil expandChildren:YES];

Я пытался вызывать один и тот же метод каждый раз, когда добавлял объект к любой сущности, думая, что он снова заполнит NSOutlineView с нуля.Вместо этого он просто выдает ошибку:

+entityForName: could not locate an NSManagedObjectModel for entity name 'Clients'

Журнал clientsMoc показывает, что он равен нулю при каждом вызове после awakefromnib (он отлично работает для этого),Я видел несколько упоминаний об этом на этом сайте, но ссылки на self или NSApp у меня пока не работают.Я не знаю, в каком направлении это принять?Мне нужно вернуть MOC не ноль.

Мой класс appdelegate является стандартным классом, настроенным для приложений с основными данными.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Ошибка, о которой вы сообщаете, не имеет никакого отношения к схеме. Это ошибка основных данных.

Либо у вас неправильное имя объекта, либо у вас управляемый контекст объекта не был инициализирован или не был должным образом упомянут.

0 голосов
/ 18 марта 2011

Я изо всех сил пытался это исправить, используя метод, который часто встречается в Google, включая обращение к NSManagedObjectContext из appDelegate, которое всегда кажется актуальным для iPhone.Я сделал Mac-версию кода в соответствии с:

clientsMoc = [(nameofAppDelegate *)[[NSApplication sharedApplication] delegate] managedObjectContext];

То, что было названо clientMoc, оказалось равным нулю.Впрочем, до самого ответа на мой вопрос.Я не уверен на 100%, но я верю, что в моем случае, возможно, дело в том, что я случайно создал два экземпляра в моем классе, как указано здесь .Причина, по которой я думаю, что это может быть правдой, заключается в том, что я иногда получал повторяющиеся ошибки в консоли.Позже мой контроллер изменился, поэтому этот вопрос стал неуместным для моего проекта.

...