CoreData many to many における、many の検索

CoreData を使い、野鳥観察記録帳のデータを管理。観察記録テーブルと野鳥一覧を many to many で連結。RDB の場合、

(1) 野鳥観察記録ー(N )観察した野鳥ー(1) 野鳥一覧

のように、テーブルを定義しますが、CoreData では many to many という指定ができるので、トランザクションテーブルである、観察した野鳥は作らなくていよい。あー便利・便利。

と、ここまでは良かったんだけど、野鳥観察記録一覧から、観察した野鳥の名前で検索するにはどうすればよいのか。つまり、あの珍しいジョウビを観察したのはどこだっけ?となってしまった場合、「ジョウビ」と入力したら、ジョウビタキが観察された記録を探して欲しいということ。

いろいろ調べたところ、SUBQUERY と ANY という指定ができるようで、

        NSPredicate* predicate =

         [NSPredicate predicateWithFormat:

          @"location CONTAINS[c] %@ OR (ANY toWildBird.jname CONTAINS[c] %@)",

          incSearchText, incSearchText];

 

こんな書き方が可能。ANY で指定している、toWildBird.jname 部分は、Relationship で定義した名前と N 側のフィールド名になる。Relationship 名の代わりにテーブルの名前にしてしまうとエラー発生(key path error)なので、すぐわかる。

many to many の指定は、RDB に慣れているとそんな指定はできないので初めよく分からなかったんだけど、追加、削除、検索がすごく簡単にできるので、理解できると、とても便利ですね。