2011-05-11 17 views
0

私はクライアントエンティティとジョブエンティティを持っています。コアデータ述語1対多および多対1の問題

各ジョブには1つのクライアントを割り当てることができます。クライアント(クライアント< - >>ジョブ)のジョブの関係は、jobOfClientと呼ばれます。

各クライアントには多くのジョブがあります。ジョブのクライアント(ジョブ< < - >クライアント)の関係は、clientOfJobと呼ばれます。

(もちろん、これらは逆の関係です。)

私が働いているいくつかの述語を持っていますが、最後のものはありません。私は、任意のクライアントに関連していない仕事を探して、仕事を通じてソート、ここで

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"clientOfJob == nil"]; 
fetchedResultsControllerのいくつかは、設定​​除外、ここでのコードの主要行の一部は、3例のためのものです

は、ここで私の並べ替えの仕事を通じて、特定のクライアントの仕事を探して:

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Job" inManagedObjectContext:dataInterface.managedObjectContext]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"clientOfJob == %@", userState.selectedClient]; 

しかし、この次は動作しません。ここでは、選択したジョブに関連付けられている1つのクライアントを検索してクライアントをソートします(または関連するクライアントがない場合は結果を返しませんが、ここでは該当しません)。

NSEntityDescription * entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:dataInterface.managedObjectContext];  
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"jobOfClient == %@", userState.selectedJob]; 

エラーメッセージが理由、キャッチされない例外により「NSInvalidArgumentException」にアプリを終了です:「に、多くの主要ここでは使用できません」

が、私は理解していないことをここに微妙な何かがあるに違いありません。 **誰かが私が与えた情報で**私を助けることができますか?コレクションは、単一の値に等しくなることはありません、明らかに

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

などCoreDataは、述語を認識しません:

答えて

0

jobOfClientは、あなたの述語が、本質的にやっている意味オブジェクトのコレクションを返します。

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

そして、あなたは再びこれに実行しないことを確認するために、私は複数形を使用して(jobOfClientからわずかjobsにこの関係の名前を変更することをお勧めします。これを回避するために、私はあなたが行うことができると思いますそれが多対多の関係であることを示し、OfClientを削除します。これはすでにClientエンティティにあるためです)。あなたの他の関係はおそらく同様に改名する必要があります。 clientOfJob =>clientなど

+0

ありがとうございます。 NSPredicate *述語= [NSPredicate predicateWithFormat:@ "ANY jobOfClient ==%@"、userState.selectedJob];この問題を解決するには、 - キーワードanyは、セット内のすべてを見渡すようにしました。 – Jim