2010-11-18 6 views
58

多対多の関係を持つ「カテゴリ」と「記事」という2つのエンティティがあります。 category.nameがある値と等しいすべての記事を検索する述語を作成したいと思います。私は、次があります。コアデータ:多対多関係のNSPredicate。 (ここでは多対多キーは許可されていません)

NSEntityDescription *entityArticle = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
NSArray  *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categories.name == [cd] %@", category.name]; 

[request setSortDescriptors:sortDescriptors]; 
[request setEntity:entityArticle]; 
[request setPredicate:predicate]; 

NSMutableArray *results = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy]; 

if ([results count] > 0) 
    NSLog(@"Results found."); 
else 
    NSLog(@"NO results found."); 

[request release]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

私は受信エラーが*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

で必要なデータを取得するためのいずれかのオプションがありますか?

+0

をサブクエリはまた、あなたが必要なものかもしれません。 参照:http://stackoverflow.com/questions/11346546/core-data-unsupported-predicate-with-all-and-in – Collin

答えて

136

コレクション(categories.name)とスカラー値(category.name)を比較しようとしています。コレクションコンパレータ(CONTAINS)を使用するか、述語修飾子(ANY/ALL/SOMEなど)を使用する必要があります。

を使用してみてください:

[NSPredicate predicateWithFormat:@"ANY categories.name =[cd] %@", category.name]; 

または:

[NSPredicate predicateWithFormat:@"categories.name CONTAINS[cd] %@", category.name]; 
+0

これは '[CD]' とし、なしの両方、私のために動作します。あなたはその機能を詳しく説明できますか? –

+15

@DuncanBabbage '[cd]'は、大文字小文字を区別しない( 'c')と分音を区別しない(' d')検索を行うことを意味します。 –

+2

'category'が 'Article'と逆の' to one '関係を持っていればうまくいきません。どのようにそれを述語するのか? – iEngineer