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

2011年1月19日水曜日 | Published in | 4 コメント

このエントリーをはてなブックマークに追加

[前回] 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

.

Responses

  1. dictav says:
    2011年11月18日 15:49

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

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

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

  2. dictav says:
    2011年11月18日 15:49

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

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

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

  3. xcatsan says:
    2011年11月19日 1:35

    dictavさん、こんばんは。

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

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

    では。

  4. xcatsan says:
    2011年11月19日 1:35

    dictavさん、こんばんは。

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

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

    では。

  5. dictav says:
    2011年11月22日 10:05

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

  6. dictav says:
    2011年11月22日 10:05

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

  7. xcatsan says:
    2011年11月22日 12:06

    こんにちは。
    %@ は動作しましたか。

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

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

    では。

  8. xcatsan says:
    2011年11月22日 12:06

    こんにちは。
    %@ は動作しましたか。

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

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

    では。

Leave a Response

人気の投稿(過去 30日間)