web-dev-qa-db-ja.com

コアデータ:多対多の関係のためのNSPredicate。 (「多対多キーはここでは許可されません」)

「Category」と「Article」という2つのエンティティがあり、それらは多対多の関係にあります。 category.nameが何らかの値に等しいすべての記事を検索する述語を作成したいと思います。私は次のものを持っています:

 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'

目的のデータを取得するオプションはありますか?

63
Oh Danny Boy

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

使用してみてください:

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

または:

[NSPredicate predicateWithFormat:@"categories.name CONTAINS[cd] %@", category.name];
148
Dave DeLong

Swift SYNTAX

Swift私がしたように...

let predicate = NSPredicate(format: "ANY categories.name = %@", category.name!)
fetchRequest.predicate = predicate

私のために働いた。

1
caleb81389