我有客户端实体和作业实体。
每个工作都可以有一个客户。客户端(客户端< - >>作业)的作业关系称为jobOfClient。
每个客户都可以有很多工作。作业客户端(作业<< - >客户端)的关系称为clientOfJob。
(当然,这些是相反的关系。)
我有一些有效的谓词,但最后一个没有。省略了一些fetchedResultsController的设置,下面是三种情况的一些关键代码行:
在这里,我对工作进行排序,寻找与任何客户无关的工作:
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"clientOfJob == nil"];
在这里,我对工作进行排序,寻找特定客户的工作:
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"clientOfJob == %@", userState.selectedClient];
但下一个不起作用。在这里,我通过客户端进行排序,寻找与所选作业相关联的一个客户端(如果没有相关客户端,则返回无结果,但这不是这种情况)。
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:dataInterface.managedObjectContext];
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"jobOfClient == %@", userState.selectedJob];
错误消息由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:'此处不允许使用多对键'
这里必须有一些我不明白的微妙之处。有人可以帮助我**我提供的信息吗?
答案 0 :(得分:0)
jobOfClient
将返回一个对象集合,这意味着您的谓词基本上正在执行:
NSSet *jobs = [thisObject jobOfClient];
return ([jobs isEqual:aJob]);
显然,集合永远不会等于单个值,因此CoreData无法识别谓词。为了解决这个问题,我认为你可以做到:
[NSPredicate predicateWithFormat:@"jobOfClient CONTAINS %@", [userState selectedJob]];
为了确保您不再遇到此问题,我建议您将此关系的名称从jobOfClient
更改为jobs
(使用复数形式表示它是一个多对多关系关系,并消除OfClient
,因为它已经在Client
实体上。您的其他关系可能应该同样重命名。 clientOfJob
=> client
等等。