2

私はNSPredicateを初めて使用するので、誰かが私が正しい道を進んでいるかどうか教えてくれれば幸いです..
問題:(クラスはNSManagedObjectのサブクラスです)
私はこのフィールドを持つプレーヤークラスを持っています:

@property (nonatomic, retain) NSSet *hisNumbers; //it's a set of Numbers

Numbers クラスは次のようになります。

@property (nonatomic, retain) NSNumber * first;
@property (nonatomic, retain) NSNumber * second;
@property (nonatomic, retain) Season *forSeason; //it's one-to-one relationship with a Season Object
@property (nonatomic, retain) Player *owner; //one-to-one with Player
@property (nonatomic, retain) NSNumber * isPresent;

Season クラスには次のパラメータがあります。

@property (nonatomic, retain) NSSet *seasonGames; //set of Game
@property (nonatomic, retain) NSSet *numbers; //set of Numbers (inverse of forSeason)

私がやろうとしているのは、シーズンオブジェクトを取り、そのシーズンのすべてのプレーヤーを返すメソッドです...
これが私の試みです:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"nameLast" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY SELF.hisNumbers.isPresent == %@) AND (ANY SELF.hisNumbers IN %@)",[NSNumber numberWithBool:YES],season.numbers];

しかし、それは機能しません..クエリの2つの部分は別々に機能するようですが、おそらくそれは単なる偶然です...

これで、フラグ「isPresent == YES」を持つ番号と、「season.numbers」のメンバーである別の番号を持つすべてのプレーヤーが返されます。代わりに、必要なのは、両方の基準に同時に一致する単一の「数字」を持っているプレーヤーです...

詳細が必要な場合はお知らせください..ありがとうございました

4

1 に答える 1

6

あなたの述語は、 の番号と のメンバーであるisPresent == YES可能性のある異なる番号を持つプレーヤーに当てはまりますseason.numbers

両方の基準に一致する (少なくとも 1 つの) 番号を持つプレーヤーを見つけるには、おそらく SUBQUERY を使用する必要があります (少なくとも、より簡単な解決策はわかりません)。

また、あなたは単純化することができます

"hisNumbers IN %@", season.numbers

"hisNumbers.forSeason == %@", season

これにより、うまく機能する次の述語が得られます。

[NSPredicate predicateWithFormat:@"SUBQUERY(hisNumbers, $x, $x.isPresent == %@ AND $x.forSeason == %@).@count > 0",
     [NSNumber numberWithBool:YES], season]

( 「NSExpression Class Reference」のexpressionForSubquery:usingIteratorVariable:predicate:を参照してください。同様の問題と SUBQUERY ソリューションが文書化されています)。

于 2012-10-27T03:49:03.283 に答える