2

個人/チームの関係をモデル化しようとしています。1 人が複数のチームに所属することができ、1 つのチームが複数の人を持つことができるため、これは多対多の関係です。ドキュメントで示唆されているように、TeamMember という中間エンティティを作成しました。私は現在、クエリを実行して、人のリストがあるかどうか、既存のチームが既に存在するかどうかを確認しようとしているため、重複したチームをデータベースに保存していません

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"Team"
            inManagedObjectContext:[pm managedObjectContext]];
[request setEntity:entity];

NSPredicate *predicate = nil;
predicate = [NSPredicate predicateWithFormat:@"ALL %K IN %@", @"teamMembers.person",  players];

プレーヤーは、私が検索しようとしている人々の NSSet です

次の例外が発生します。

キャッチされない例外 'NSInvalidArgumentException'、理由: 'サポートされていない述語 ALL teamMembers.person IN { (エンティティ: Person; id: 0x1334470 ; データ: {

理想的には、IN だけでなく、正確に一致させたいと考えています。

どんな助けでも大歓迎です

4

1 に答える 1

5

まず、あなたのデータモデルを見ることは役に立ちますが、あなたは次のようなことをしていると思います:

Person <-->> TeamMember <<--> Team

ドキュメントでこれを見たと思います(理由は不明ですが、単純なことを複雑にする傾向があります)。なぜあなたはこれをやっている?その TeamMember オブジェクトに固有のデータがない限り、次のことができます。

Person <<-->> Team

第二に、述語が正しくなく、不要である可能性があります。すでに個人への参照があるため、次の方法で直接、その個人が所属するチームを照会できます。

NSSet *teams = [person valueForKeyPath:@"teamMembers.@distinctUnionOfSets.team"];

これにより、一連の Team オブジェクトが返されます。ただし、TeamMember オブジェクトを削除すると、このクエリを次のように簡略化できます。

NSSet *teams = [person valueForKey@"teams"];

Core Data は逆NSSetに使用NSArrayするため、このレベルでは重複について心配する必要さえありません。なぜなら、同じチームをセットに複数回追加しようとすると無視されるからです。

答えを締めくくるには、述語の問題は、コア データに対する述語で IN と ALL を混在させることができないことです。これは既知の制限です。したがって、上で説明したアプローチを使用することをお勧めします。

于 2010-04-02T15:25:50.173 に答える