CoreData NSP предикат с отношением «многие ко многим» - PullRequest
2 голосов
/ 24 июня 2010

Я смоделировал отношение Персона / Метка. Это отношения многие ко многим; у человека может быть несколько тегов, а тег может быть связан с несколькими людьми.

Я пытаюсь выполнить запрос, чтобы увидеть список людей, которые были помечены КАЖДЫМ тегом из набора тегов. Например: каждый человек, который был помечен как 'FOO' и 'BAR'.

Это код, который я пытался безуспешно.

NSPredicate *attributePredicate = [NSPredicate predicateWithFormat: 
                                       @"ALL personTags.tagName in %@", filtersArray];
[subPredicates addObject:attributePredicate];;

Есть ли способ обойти это? Я использую SqlLite в качестве постоянного хранилища. У меня в базе данных около 2000 человек и около 100 различных тегов, только несколько из них будут применены одновременно.

1 Ответ

6 голосов
/ 24 июня 2010

Отмените запрос и запросите теги, которые "self in% @", и затем вы можете выполнить операцию KVC с результирующим массивом, например:

NSArray *array = [results valueForKeyPath:@"@distinctUniionOfArrays.person"];

, которая даст вам результаты, которые вы ищетеза.Обратите внимание, что это было напечатано на моем iPad, поэтому возможны опечатки.

См. Документацию по этому вопросу

http://developer.apple.com/mac/library/iPad/index.html#documentation/Cocoa/Conceptual/KeyValueCoding/Concepts/ArrayOperators.html

Обновление

Извините, янеправильно прочитал вопрос.Я бы предложил попробовать подзапрос.Без доступа к вашей структуре данных трудно проверить это, чтобы получить его правильно, но этот код должен направить вас на правильный путь:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:@"(SUBQUERY(self.tags, $tag, ALL $tag.name in %@).count > 0)", tagNameArray]];

NSError *error = nil;
NSArray *results = [moc executeFetchRequest:request error:&error];
NSAssert2(error == nil, @"Error fetchings tags: %@\n%@", [error localizedDescrption], [error userInfo]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...