0

次のCoreDataオブジェクトモデルがあります

ここに画像の説明を入力

現在、次の条件で述語を作成する際に問題が発生しています。

それらすべてを取得しますDBOpportunityWHERE

DBOpportunity.stateCode == 1

DBOpportunity.invoiceDate >= GIVEN_DATE

DBOpportunityLines.crmAccept == 1 または DBOpportunityLines.crmAccept == 3

Apple が提供する多くの例とプログラミング ガイドを試しましたが、これを達成できません。

4

3 に答える 3

3

opportunitylines対多の関係であるため、1 つの DBOpportunity オブジェクトに対して複数の DBOpportunityLines オブジェクトがあります。最後の条件と仮定すると

DBOpportunityLines.crmAccept == 1 または DBOpportunityLines.crmAccept == 3

関連するオブジェクトのいずれかを保持する必要がある場合は、SUBQUERY が必要です。

NSDate *givenDate = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stateCode == 1 AND invoiceDate >= %@ "
    "AND SUBQUERY(opportunitylines, $x, $x.crmAccept == 1 OR $x.crmAccept == 3).@count > 0",
    givenDate];

注意:残念ながら、述語での SUBQUERY の使用法については十分に文書化されていません。NSExpression クラス リファレンスに1 つの例があります。NSPredicate Expression の SUBQUERY の簡単な説明も参照してください。

于 2013-05-24T06:58:10.010 に答える
2

述語の構造はA && B && (C || D)

述語を設定する

NSPredicate *aPredicate = [NSPredicate predicateWithFormat:@"stateCode == %d", value];
NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"invoiceDate >=  %@", givenDate];

cPredicate と dPredicate も同様です。次に、最初に c と d を OR で結合します

NSArray *cdPredicateArray = @[cPredicate, dPredicate];
NSPredicate *cdPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:cdPredicateArray];

そしてそれらすべてを AND で

NSArray *allPredicateArray = @[aPredicate, bPredicate, cdPredicate];
NSPredicate *allPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:allPredicateArray];

私があなたの質問を誤解し、あなたの構造A && B && C || D

于 2013-05-24T06:14:09.200 に答える