2 core-data objective-c nspredicate
我正在尝试模拟一个人/团队的关系.这是一个多对多的关系,因为一个人可以属于多个团队,一个团队可以有多个人.正如文档所建议的,我创建了一个名为TeamMember的中间实体.我现在正在尝试运行一个查询,看看我是否有一个人员列表,是否已存在已有的团队,所以我不会在数据库中存储重复的团队
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"Team"
inManagedObjectContext:[pm managedObjectContext]];
[request setEntity:entity];
NSPredicate *predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"ALL %K IN %@", @"teamMembers.person", players];
Run Code Online (Sandbox Code Playgroud)
玩家是我试图搜索的NSSet
我收到以下异常:
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'不支持的谓词ALL teamMembers.person IN {(entity:Person; id:0x1334470; data:{
理想情况下,我希望他们完全匹配,而不仅仅是做一个IN.
任何帮助将不胜感激
首先,看到你的数据模型会有所帮助,但我猜你正在做的事情如下:
Person <-->> TeamMember <<--> Team
Run Code Online (Sandbox Code Playgroud)
我意识到你在文档中看到了这一点(由于未知的原因,它往往使简单的事情复杂化),我不得不问; 你为什么做这个?除非有特定于该TeamMember对象的数据,否则您可以这样做:
Person <<-->> Team
Run Code Online (Sandbox Code Playgroud)
其次,你的谓词不正确,可能没必要.由于您已经拥有对此人的引用,因此您可以通过以下方式直接查询该人所属的团队:
NSSet *teams = [person valueForKeyPath:@"teamMembers.@distinctUnionOfSets.team"];
Run Code Online (Sandbox Code Playgroud)
这将为您提供一组Team对象.但是,如果您删除TeamMember对象,则可以使用以下方法简化此查询:
NSSet *teams = [person valueForKey@"teams"];
Run Code Online (Sandbox Code Playgroud)
因为核心数据使用NSSet而不是NSArray你甚至不需要担心这个级别的重复,因为如果你尝试将同一个团队多次添加到集合中,它将被忽略.
为了完善答案,你的谓词的问题在于你不能将IN和ALL混合在一个谓词中,而不是核心数据.这是一个已知的限制.因此,我建议采用上述方法.