CoreData NSPredicate具有多对多关系

时间:2010-06-23 20:28:37

标签: iphone core-data many-to-many

我已建模人/标签关系。这是一对多关系;一个人可以有多个标签,一个标签可以与多个人相关联。

我正在尝试运行查询以查看获取人员列表,这些人员已使用一组标记的每个标记进行了标记。例如:每个被标记为“FOO”和“BAR”的人。

这是我尝试的代码没有成功。

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

这有什么办法吗?我正在使用SqlLite作为持久性存储。 我在数据库中有大约2000个人和大约100个不同的标签,只有少数标签会同时应用。

1 个答案:

答案 0 :(得分:6)

反转您的查询并询问“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]);