繁体   English   中英

具有多对多关系的CoreData NSPredicate

[英]CoreData NSPredicate with many-to-many relationship

我已经建立了一个人/标签关系模型。 这是多对多的关系。 一个人可以有多个标签,并且一个标签可以与多个人相关联。

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

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

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

有没有办法解决? 我正在使用SqlLite作为持久性存储。 我在数据库中大约有2000个人,大约有100个不同的标签,只有几个标签可以同时应用。

反向查询并询问“%@自身”的标签,然后可以对结果数组执行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]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM