2

我正在尝试为人/团队关系建模。这是多对多的关系,因为一个人可以属于多个团队,一个团队可以有多个人。正如文档所建议的,我创建了一个名为 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];

玩家是我正在尝试搜索的人的 NSSet

我收到以下异常:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的谓词 ALL teamMembers.person IN {(实体:Person;id:0x1334470;数据:{

理想情况下,我希望它们完全匹配,而不仅仅是做一个 IN。

任何帮助将不胜感激

4

1 回答 1

5

首先,查看您的数据模型会有所帮助,但我猜您正在执行以下操作:

Person <-->> TeamMember <<--> Team

我意识到您在文档中看到了这一点(由于未知原因,这往往会使简单的事情变得复杂),我不得不问;你为什么做这个?除非有特定于该 TeamMember 对象的数据,否则您可以这样做:

Person <<-->> Team

其次,您的谓词不正确并且可能是不必要的。由于您已经有了对该人的引用,您可以通过以下方式直接查询该人所属的团队:

NSSet *teams = [person valueForKeyPath:@"teamMembers.@distinctUnionOfSets.team"];

这将为您返回一组 Team 对象。但是,如果您删除 TeamMember 对象,则可以通过以下方式简化此查询:

NSSet *teams = [person valueForKey@"teams"];

因为 Core Data 使用NSSet而不是NSArray你甚至不需要担心这个级别的重复,因为如果你尝试将同一个团队多次添加到集合中,它将被忽略。

为了完善答案,您的谓词的问题是您不能在针对 Core Data 的谓词中将 IN 和 ALL 混合在一起。这是一个已知的限制。因此,我建议采用上述方法。

于 2010-04-02T15:25:50.173 回答