NSPredicate 在多对多关系中

Posted

技术标签:

【中文标题】NSPredicate 在多对多关系中【英文标题】:NSPredicate in many to many relation ship 【发布时间】:2012-10-10 23:15:54 【问题描述】:

我有以下实体关系A > B,好吗? 现在,在应用程序的生命周期中,我有两个 A 类型的对象,我想知道包含这些对象的 B 的所有对象...

我尝试在 B 实体上使用 ...ANY aRelationWithA.att == objectA1.att...,但是,另一个对象呢...?我找到了一个 SUBQUERIES 解决方案,但结果相同,因为使用 ...SUBQUERY(aRelationWithA, $object, $object.att == objectA1.att)...,但同样,另一个对象呢...?

我需要在这些关系 A > B 中包含那些 A 对象的 B 对象,问候!

【问题讨论】:

SUBQUERY(aRelationWithA, $object, $object.att==objectA1.att && $object.att==objectA2.att) 不工作吗? 感谢您的回答,但它不起作用! 【参考方案1】:

我暂时使用了两个 NSPredicates 来验证该条件...

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"B"];
propertyRequest.predicate = [NSPredicate predicateWithFormat:@"ANY aRelationWithA.att == %@", objectA1.att];
NSError *error;
NSArray *collection1 = [context executeFetchRequest:request error:&error];
NSArray *collection2 = [collection1 filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"ANY aRelationWithA.att == %@", objectA2.att]];
if (collection2.count) NSLog(@"There are some objects with that condition");

感谢您的回复或参考,以了解有关此主题的更多信息!

【讨论】:

【参考方案2】:

这很简单:

NSFetchRequest *r = [NSFetchRequest fetchRequestWithEntityName:@"B"];
[r setPredicate:[NSPredicate predicateWithFormat:@"ANY relationshipToA = %@ OR ANY relationshipToA = %@", objectA1, objectA2]];

【讨论】:

@specktro 您需要在问题中包含更多信息。请准确地描述您要完成的工作,因为您已经得到了几个本应有效但显然无效的答案。向我们展示您在做什么,以及您希望它做什么。 嗨,戴夫,没有其他方法可以解释我的问题,我有这种关系 A > B... 在应用程序生命的某些部分,我得到了两个 A 类型的对象我想知道在某些 NSManagedObjectContext 中通过 NSFetchRequest 上的 NSPredicate 包含它们的对象 B。我已经探索了这里提供的解决方案,但没有一个答案能解决我的问题,我的解决方案得到了正确的结果,但对我来说效率不高。【参考方案3】:

尝试使用这个谓词

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY aRelationWithA in %@", [NSArray arrayWithObjects:objB1, objB2, nil]; 

【讨论】:

我更新了我的答案。我从谓词中删除了“.attr” 您的解决方案没有失败,但没有提供正确的结果,谢谢!

以上是关于NSPredicate 在多对多关系中的主要内容,如果未能解决你的问题,请参考以下文章

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

如何为 CoreData 多对多关系编写 NSPredicate

用于多对多关系的 NSPredicate

具有多对多关系的核心数据 NSPredicate

具有多对多关系的 NSPredicate

核心数据 - 从多对多关系构建 NSPredicate