私はこのような3つのエンティティがあります。 出版社< -------- >>著者< -------- >>コアデータフィルタ
Publisher{
id = <uniqueId>
authors -->> Author
}
Author{
id = <uniqueId>
books -->> Book //ordered relationship
publisher --> Publisher
}
Book{
info = <string_with_info>
author --> Author
}
ブックすべての書籍を著者IDと出版社IDでフィルタリングし、その情報属性を取得したいと考えています。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author.publisher.id == %@ AND author.id == %@", publisherId, authorId];
[request setPredicate:predicate];
[request setEntity:[NSEntityDescription entityForName:@"Book" inManagedObjectContext:managedContext]];
[request setResultType:NSDictionaryResultType];
[request setReturnsDistinctResults:YES];
[request setPropertiesToFetch:@[@"info"]];
NSError *error = nil;
NSArray *results = [managedContext executeFetchRequest:request error:&error];
結果には、書籍の情報が記載された多数の文字列が含まれている必要があります。 author.publisher.id == %@
の部分が動作するかどうかわかりません。
私は著者に手を差し伸べ、書籍エンティティでMutableSetを取得できました。どこからループして情報を新しい配列にプッシュできますか?これは仕事ですが、できるだけフェッチするだけで同じことをしたいと思います。
編集:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(author, $x, (0 != SUBQUERY($x.publisher, $y, $y.id like %@)[email protected]))[email protected]) AND author.id like %@ ", publisherId, authorId];
いくつかの明確化:機能するソリューションはそうのような述語を変えています。作者IDはパブリッシャーに関連付けられ、そのパブリッシャーに対してのみ固有です。同一のIDを持つが発行元の異なる2人の作家を持つことができます。
拡大元の質問です。著者の書籍が注文されます。 results
の情報は著者と同じ順序で注文されますか?私の限られたテストでの答えは「はい」です。
可能なIDの競合は、Mundiによって指摘されています。
著者IDはパブリッシャーに関連付けられています。他の出版社の別の著者と同じIDを持つ著者を持つ第2の出版社を持つことは可能です。質問で正しく説明していないのは私の間違いです。可能なIDの競合を指摘していただきありがとうございます。それを修正します。 – h3dkandi
それでもロジックは保持されます。コアデータは、これらの著者IDが何であるか気にしません。フレームワークは関係を介して独自のIDを保持します。 – Mundi
私は理解できません。 authorID = 1と言うことができるすべての本をフィルタリングしているわけではありません。そして、私たちは2つの出版社でそのようなauthorIDを持っています。したがって、あなたの述語は、authorID = 1->の本を持つPublisherOne-> AuthorOneと、authorID = 1->の本を持つPublisherTwo-> AuthorTwoを取得します。今、あなたは両方の著者の本で結果を得ています。 – h3dkandi