Исключения NSPredicate отношения «многие ко многим» CoreData - PullRequest
2 голосов
/ 02 апреля 2010

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

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"Team"
            inManagedObjectContext:[pm managedObjectContext]];
[request setEntity:entity];

NSPredicate *predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"ALL %K IN %@", @"teamMembers.person",  players];

игроков - это NSSet людей, которых я пытаюсь найти

Я получаю следующее исключение:

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Неподдерживаемый предикат ALL teamMembers.person IN {(entity: Person; id: 0x1334470; данные: {

В идеале я бы хотел, чтобы они точно совпадали, а не просто делали IN.

Любая помощь будет принята с благодарностью

1 Ответ

5 голосов
/ 02 апреля 2010

Во-первых, было бы полезно увидеть вашу модель данных, но я предполагаю, что вы делаете что-то вроде:

Person <-->> TeamMember <<--> Team

Я понимаю, что вы видели это в документах (которые, как правило, усложняют простые вещи по неизвестным причинам), я должен спросить; почему ты это делаешь? Если нет данных, специфичных для этого объекта TeamMember, то вы можете просто сделать:

Person <<-->> Team

Во-вторых, ваш предикат неверен и, вероятно, не нужен. Поскольку у вас уже есть ссылка на этого человека, вы можете напрямую запросить команды, в которые он входит:

NSSet *teams = [person valueForKeyPath:@"teamMembers.@distinctUnionOfSets.team"];

Что вернет вам набор командных объектов. Однако если вы удалите объект TeamMember, вы можете упростить этот запрос с помощью:

NSSet *teams = [person valueForKey@"teams"];

Поскольку в Core Data используется NSSet, а не NSArray, вам даже не нужно беспокоиться о дублировании на этом уровне, потому что если вы попытаетесь добавить одну и ту же команду в набор более одного раза, она будет проигнорирована.

И чтобы завершить ответ, проблема с вашим предикатом заключается в том, что вы не можете смешивать IN и ALL в предикате против Базовых данных. Это известное ограничение. Поэтому я рекомендую использовать подход, описанный выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...