2011年1月19日水曜日

[Mac][iOS] NSPredicate - SUBQUERY の書き方

[前回] Cocoaの日々: [Mac][iOS] NSPredicate - 1対多関連のエンティティの検索条件見本(訂正〜サブクエリーの利用)

SUBQUERY情報


前回使った SUBQUERY の情報は NSPredicate の話題を扱っている "Predicate Programming Guide" には無くて、NSExpression のクラスリファレンスに記載されていた。

NSExpression Class Reference

書式はこう
SUBQUERY(collection_expression, variable_expression, predicate);
variable_expression は predicate 内で collection_expression を参照する時の名前を記述する。
前回の設定を例に出すとこんな感じ。
SUBQUERY(books, $s, $s.date >= %@ AND $s.date < %@).@count > 0
$s が books の(一種)別名となり、これを条件内で $s として参照している。SUBQUERYの結果に対して集計関数を適用することができる。例では @count(レコード数)関数を適用して「0件以上」という条件にしている。

[参考情報] Cocoaの日々: [Mac][iOS] NSPredicate - 1対多関連のエンティティの検索条件見本(集計関数使用)


以下、リファレンスページから例文を転載して紹介する。
(SUBQUERY(residents, $x, $x.firstname == "Jane" && $x.lastname == "Doe").@count != 0)
こうも書けるらしい。
(SUBQUERY(residents, $x, $x.firstname == "Jane" && $x.lastname == "Doe")[size] != 0)


参考情報


Predicate Programming Guide: Introduction to Predicates Programming Guide

.

4 件のコメント:

  1. いつも分かりやすい記事をありがとうございます。とても参考になります。
    SUBQUERY と $VARIABLE_NAME 形式の値の渡し方についてご存知でしたら教えていただけないでしょうか。

    具体的には LIST と ITEM というエンティティが多対多関連で結ばれています。特定のLISTと関連づけられているITEMの一覧を得たいと思っています。この時、LISTは複数を指定したいのです。

    SUBQUERY(lists,$s,$s IN $SEARCHINGLISTS).@count > 0
    のように検索質のですが、SUBQUERY 内部では predicateWithSubstitutionVariables: メソッドを用いても $SEARCHINGLISTS は展開されません。
    何かよい方法があるのでしょうか?

    返信削除
  2. dictavさん、こんばんは。

    なるほど。$SEARCHINGLISTSの代わりに %@ を充てるのはどうでしょうか。

    p = [NSPredicate predicateWithFormat:
    @"SUBQUERY(lists,$s,$s IN %@).@count > 0", searchingLists];
    みたいな。
    (実際に試してないので動作するかわかりませんが。。)

    では。

    返信削除
  3. xcatsan さん、ありがとうございます。
    %@で動作しました。
    実は $SEARCHINGLISTS を使用したいのには訳がありまして、$SEARCHINGLISTS の形式なら Xcode の Model Editor で設定しておく事ができるのです。
    とりあえず %@ でしのぐ事にしました。
    ありがとうございました。

    返信削除
  4. こんにちは。
    %@ は動作しましたか。

    > 実は $SEARCHINGLISTS を使用したいのには訳がありまして、
    > $SEARCHINGLISTS の形式なら Xcode の Model Editor で設定しておく事ができるのです。

    なるほど。
    参考になりました。

    では。

    返信削除