核心数据谓词对多

Posted

技术标签:

【中文标题】核心数据谓词对多【英文标题】:Core Data predicate to-many 【发布时间】:2012-10-29 15:33:55 【问题描述】:

我正在尝试查找与字符串和一组对象匹配的对象。我的谓词如下所示:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@ and individuals CONTAINS %@", name, individuals];

我没有得到任何点击。虽然我知道有一个实体匹配名称和个人设置。

我的谓词有什么问题?

编辑:我已经取得了一些进展。现在的问题是,如果我尝试找到一个具有现有组名和现有联系人的组,即 groupname = "test" 和 individual.name = "john doe" 和 individual.contactInfo = "123" 它会正确找到我这个组但是如果我有一个组具有相同的组名和相同的联系人 + 另一个联系人,它也会找到我不想要的这个组。

我只想要与谓词完全匹配的组。

我现在通过这样做来使用子谓词:

NSMutableArray *subPredicates = [NSMutableArray initWithCapacity:5];
// Add group name to predicate
[subPredicates addObject:[NSPredicate predicateWithFormat:@"name == %@", name]];

for (NSDictionary *contactInfo in individuals) 

    NSString *name = [contactDict objectForKey:@"name"];
    NSString *contactInfo = [contactDict objectForKey:@"contactInfo"];

    NSPredicate *individualPredicate = [NSPredicate predicateWithFormat:@"ANY individuals.name LIKE %@ AND any individuals.contactInfo LIKE %@", name, contactInfo];

    [subPredicates addObject:individualPredicate];


NSPredicate *individualsPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];

Group *group = // do the fetch with the predicate

【问题讨论】:

【参考方案1】:

一组对象不能与CONTAINS 谓词匹配。您可以使用 ANY 谓词匹配集合中的一个对象:

[NSPredicate predicateWithFormat:@"name == %@ and ANY individuals.name == %@", name, individualName]; 

【讨论】:

那么没有办法将NSSet 与谓词匹配? 我更新了我的代码,我想几乎就在那里。你能帮我完成最后一块吗? 如果要匹配集合中的所有元素,可以使用 ALL 谓词而不是 ANY。【参考方案2】:

我正在手机上输入此内容,无法验证,但以下谓词可能对您有用:

[NSPredicate predicateWithFormat:@"name == %@ AND SUBQUERY(individuals, $x, $x IN %@).@count == %d", 
    name, individuals, individuals.count];

它搜索具有给定名称的对象,其个体是给定集合的超集。

【讨论】:

我认为 SUBQUERY 可用于根据谓词过滤出集合。苹果的例子:(SUBQUERY(residents, $x, $x.firstname == "Jane" && $x.lastname == "Doe").@count != 0)。我认为它不适用于给定的元素列表。 这个谓词对我不起作用,如果我有一个包含两个人的组,即使我只提供了这个组中的一个人,这个谓词也会返回这个组。 我想我在您回答的另一个线程中找到了我的问题的确切答案,因此我会将这个答案标记为已接受。 (在这里回答:***.com/a/13086353/294661) @PeterWarbo:“如果我有一个包含两个人的组,即使我只提供了这个组中的一个人,这个谓词也会返回这个组” - 我认为这就是你想要的,因为您的初始示例在谓词中使用了“CONTAINS”。但我很高兴我的回答对您有所帮助。

以上是关于核心数据谓词对多的主要内容,如果未能解决你的问题,请参考以下文章

具有多对多谓词的核心数据

核心数据关系中对象的谓词

核心数据:有序关系中第一个元素的谓词

核心数据对多关系 NSPredicate 来获取

NSPredicate 在核心数据中的多对多关系

来自核心数据多对多关系的随机实体