2011-05-11 85 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