我已建模人/标签关系。这是一对多关系;一个人可以有多个标签,一个标签可以与多个人相关联。
我正在尝试运行查询以查看获取人员列表,这些人员已使用一组标记的每个标记进行了标记。例如:每个被标记为“FOO”和“BAR”的人。
这是我尝试的代码没有成功。
NSPredicate *attributePredicate = [NSPredicate predicateWithFormat:
@"ALL personTags.tagName in %@", filtersArray];
[subPredicates addObject:attributePredicate];;
这有什么办法吗?我正在使用SqlLite作为持久性存储。 我在数据库中有大约2000个人和大约100个不同的标签,只有少数标签会同时应用。
答案 0 :(得分:6)
反转您的查询并询问“self in%@”中的标签,然后您可以对结果数组执行KVC操作,如:
NSArray *array = [results valueForKeyPath:@"@distinctUniionOfArrays.person"];
这将为您提供所需的结果。请注意,这是在我的iPad上输入的,因此可能存在错别字。
请参阅有关此主题的文档
抱歉,我误解了这个问题。我建议尝试一个子查询。如果没有访问您的数据结构,很难对其进行测试以使其完全正确,但此代码应该让您走上正确的道路:
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]);