2011-05-11 86 views
0

我有客户端实体和作业实体。核心数据谓词一对多和多对一的问题

每个工作都可以有一个客户。客户端的作业(客户端< - >>作业)的关系称为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

jobOfClient将返回对象的集合,这意味着你的谓语基本上是这样做的:

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

显然,收藏是永远等于一个值,所以CoreData不承认谓词。为了解决这个问题,我想你可以这样做:

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

,并确保你不要再碰上这个,我会建议只是jobs(使用复数形式从jobOfClient改变这种关系的名称以表示它是一对多的关系,并且因为它已经在Client实体上,所以消除了OfClient)。您的其他关系可能应该重新命名。 clientOfJob =>client

+0

谢谢。我能够使用这个解决问题:NSPredicate * predicate = [NSPredicate predicateWithFormat:@“ANY jobOfClient ==%@”,userState.selectedJob]; - 任何关键字都会导致它查看集合中的所有内容。 – Jim