核心数据预测一对多和多对一的问题

时间:2011-05-11 04:52:54

标签: core-data nsfetchedresultscontroller nspredicate

我有客户端实体和作业实体。

每个工作都可以有一个客户。客户端(客户端< - >>作业)的作业关系称为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'而终止应用,原因:'此处不允许使用多对键'

这里必须有一些我不明白的微妙之处。有人可以帮助我**我提供的信息吗?

1 个答案:

答案 0 :(得分:0)

jobOfClient将返回一个对象集合,这意味着您的谓词基本上正在执行:

NSSet *jobs = [thisObject jobOfClient];
return ([jobs isEqual:aJob]);

显然,集合永远不会等于单个值,因此CoreData无法识别谓词。为了解决这个问题,我认为你可以做到:

[NSPredicate predicateWithFormat:@"jobOfClient CONTAINS %@", [userState selectedJob]];

为了确保您不再遇到此问题,我建议您将此关系的名称从jobOfClient更改为jobs(使用复数形式表示它是一个多对多关系关系,并消除OfClient,因为它已经在Client实体上。您的其他关系可能应该同样重命名。 clientOfJob => client等等。