2016-04-06 4 views
0

私はこのような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によって指摘されています。

答えて

1

まず、あなたのauthorIDがユニークないであることを明らかにした後、あなたは元の化合物の述語を使用する必要がありますいくつかのがあるので、

ところで
NSPredicate(format: "author.publisher = %@ && author.authorID = %@", 
    publisher, authorID) 

を、私は何か他のものを使用して、属性「ID」を置き換えます潜在的な名前は "id"と競合します。

しかし、あなたは唯一の述語は、より簡潔な作り、著者を取得することができます

NSPredicate(format: "publisher = %@ && authorID = %@", publisher, authorID) 

第二には、本がすでに設定されているので、明確な結果を得るために必要はありませんです。実際には、作成者オブジェクトを持っている場合は明示的にフェッチせずにこれを行うことができます。

​​

すべてが必要です。どのようにエレガントなスウィフトができるか見てみましょう!

+0

著者IDはパブリッシャーに関連付けられています。他の出版社の別の著者と同じIDを持つ著者を持つ第2の出版社を持つことは可能です。質問で正しく説明していないのは私の間違いです。可能なIDの競合を指摘していただきありがとうございます。それを修正します。 – h3dkandi

+0

それでもロジックは保持されます。コアデータは、これらの著者IDが何であるか気にしません。フレームワークは関係を介して独自のIDを保持します。 – Mundi

+0

私は理解できません。 authorID = 1と言うことができるすべての本をフィルタリングしているわけではありません。そして、私たちは2つの出版社でそのようなauthorIDを持っています。したがって、あなたの述語は、authorID = 1->の本を持つPublisherOne-> AuthorOneと、authorID = 1->の本を持つPublisherTwo-> AuthorTwoを取得します。今、あなたは両方の著者の本で結果を得ています。 – h3dkandi