フタなしカンヅメ

徒然なるままに @happytar0

CoreDataのFetchRequestテンプレートで配列を指定

クライアントアプリのコード内にSQL分を書くのがどうもしっくりこないので、FetchRequestのテンプレを使うようにしている。
単純なデータを格納することが多いせいか、テンプレだけで問題になったことはない。

fetchRequestFromTemplateWithNameメソッドでテンプレ名とプレースホルダの変数を渡すのだけど、IN句を使う必要が出てきて少し悩んだ。

テンプレのSQL分には最初、field_name IN ($hoge) のような形で設定してみたのだけど勝手に括弧が外れて、 field_name IN $hoge になった。
こういうもんなのかと思い、プレースホルダにカンマ区切りの文字列を渡してみたがエラー・・・。

どうやらNSArrayをそのまま渡せばいいだけのようだ。

NSArray *ids = @[@1, @2, @3, @4];
NSDictionary *subs = @{@"hoge":ids};
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"findByIds" 
      substitutionVariables:subs];

何度も使う場合、テンプレを使うことでSQL文のパース処理を省くことができるので若干高速化するようだ。
NSPredicateなんてのもあるんだなぁ・・・