コアデータ、NSPredicateを使用してtoMany関係セットをフィルタリングしようとしましたが、「to-many key not allowed here」エラーが発生しました

core-data iphone nspredicate objective-c
コアデータ、NSPredicateを使用してtoMany関係セットをフィルタリングしようとしましたが、「to-many key not allowed here」エラーが発生しました

ここに私が持っているモデルがあります:http://www.girardet.ch/model.png

私の目標は、これらの基準を持つすべての見積を取得することです。

  • 特定のテーマに属する:テーマのname_en属性

  • 関連性による順序付け

  • 作成者によるフィルタリング(作成者のエイリアス属性を使用)

これが私のコードです:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ThemeEntries" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"relevancy" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

// predictate - filter
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"theme.name_en=%@ AND quotes.author.alias=%@",@"mytheme", @"myauthor"];

[fetchRequest setPredicate:predicate];

「多対多キーはここでは許可されていません」というエラーが表示されます。

代わりにこの述語を使用する場合

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"theme.name_en=%@, @"mytheme"];

それはうまく機能し、取得した「ThemeEntries」をループしてすべての引用を取得できます…​ しかし、それは著者によってフィルタリングされていません。

著者でフィルタリングするにはどうすればよいですか?

  6  13


ベストアンサー

あなたの問題は、あなたのキーパスの1つの関係が多対多であり、述語がどの特定のオブジェクトがどのオブジェクトに対応するかを知らないことです。

あなたは `ThemeEntities <<→> Quotes`を持っています。これは両端でセットを生成します。 `quotes.author.alias`キーパスは「それぞれが別名属性を持つ作成者インスタンスにリンクされた引用インスタンスのセット」と言います。述部はセットを処理できません。

サブクエリを使用して、多対多のキーパスをジャンプする必要があります。 サブクエリは本質的に、セットを検索し、ネストされた述語に一致するオブジェクトの別のセットを返すネストされた述語です。 サブクエリの文書化は不十分ですが、形式は次のとおりです。

SUBQUERY(collectionName,$collectionElementVariable,expression-with-$collectionElementVariable)

この場合、提供された文字列に一致するエイリアスと作成者の関係を持つ引用インスタンスを探しています。 述部は次のように見える必要があります。

@"theme.name_en=%@ AND (0!=SUBQUERY(quotes,$eachQuote,$eachQuote.author.alias=%@)[email protected])",@"mytheme", @"myauthor"

サブクエリは、「引用のセットのうち、各引用オブジェクトを取得し、その著者関係オブジェクトに「myauthor」に一致するエイリアス属性があるかどうかをテストします。 一致する引用オブジェクトの数を数えます。 数値がゼロ以外の場合、TRUEを返します。」

多対多の関係でキーパスをたどるときは常に、サブクエリを使用する必要があります。

26


タイトルとURLをコピーしました