Как я могу создать отношение Базовых Данных от одной сущности к другой, существующей сущности? - PullRequest
1 голос
/ 22 июня 2011

Во время создания сущности Базовых данных (Событие) я создаю связь с другой сущностью (Командой).Это отношение многие-к-одному от команды к событиям (одна команда, много событий) и обратное отношение от события к команде.

Команда <----- >> Событие.

Правило удаления для обоих отношений установлено в «Обнулить».

Приведенный ниже блок кода успешно работаетпервое население, когда новая команда создается во время создания каждого события.Однако, если я затем удаляю Событие и пытаюсь повторно добавить его, существующая Команда извлекается, но код завершается неудачно при попытке добавить объект Команды в Событие в последней строке примера.Ошибка выглядит следующим образом: -[__NSCFDictionary managedObjectContext]: unrecognized selector sent to instance 0x699ed60

Как правильно создать связь между объектом Event и объектом Team, который уже существует?

Team *currentTeam = self.team;
Team *newTeam = (Team *)[self loadTeamForNid:[NSNumber numberWithInteger: [teamNid integerValue]]];
// If the nid of the referenced team has changed, 
if (![[[currentTeam nid] stringValue] isEqualToString:teamNid]) {
    currentTeam = nil;
    currentTeam = newTeam;
}

// If an event has not been set by this point, it does not exist in the CD store, and we need to create it.
if (currentTeam == nil) {
    currentTeam = (Team *)[NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:[delegate managedObjectContext]];    
    [currentTeam populateTeamWithNode:[node nodeGet:teamNid]];
}

// TODO: This breaks on reload of an object
//    self.team = currentTeam;
[self setValue:currentTeam forKey:@"team"];

1 Ответ

3 голосов
/ 23 июня 2011

Концептуально вы не ошибаетесь: вы устанавливаете свойство «team» события для экземпляра NSManagedObject, представляющего соответствующую команду.

Это сообщение:

-[__NSCFDictionary managedObjectContext]: unrecognized selector sent to instance 0x699ed60

Означает, чтонекоторая строка кода обрабатывает экземпляр NSDictionary, где он ожидает (я предполагаю) экземпляр NSManagedObject.Когда он пытается запросить у объекта managedObjectContext, генерируется исключение, потому что NSDictionary не реализует метод для этого селектора.

Первое, что нужно сделать, это поставить точку останова на этой последней строке и посмотретьесли currentTeam на самом деле замаскированный NSDictionary.(Это кажется маловероятным, учитывая, что код выше исключения был бы достигнут раньше.) Если нет, вам придется искать связанные свойства, которые могут быть связаны с этим путем кода.

Обратите внимание, что Core Dataподдерживает стиль запроса выборки, в котором он возвращает экземпляры NSDictionary вместо NSManagedObjects;если вы используете это где-нибудь в своем коде, вы можете случайно передать результат другому методу, который этого не ожидает.

...