ページ

2010年5月27日木曜日

CoreData - 検索見本(NSManagedObjectを条件に検索)

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

NSPredicate を使う。
例えば、Customer(マスタ)<−−−>> Karte(ディティール)というモデルがあり、特定の Customer に紐づく Karteの一覧を取得する場合。


// Edit Predicade
NSPredicate* predicate =
  [NSPredicate predicateWithFormat:@"customer == %@", customer];
[request setPredicate:predicate];


オブジェクトが条件の場合でも上記のように等号条件として書ける。

SQLite のログはこう。
SELECT 0, t0.Z_PK FROM ZKARTE t0 WHERE  t0.ZCUSTOMER = ? ORDER BY t0.ZOPERATEDDATE DESC

SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZMODIFIEDDATE, t0.ZFEE, t0.ZMEMO, t0.ZCREATEDDATE, t0.ZOPERATEDDATE, t0.ZCUSTOMER FROM ZKARTE t0 WHERE  t0.Z_PK IN  (?,?,?)  ORDER BY t0.ZOPERATEDDATE DESC LIMIT 20

最初に Customer を条件にして合致する Karteの PK(Primary Key)を取得している。そして、取得した PK を SELECT ...IN( ) の条件として Karteのデータを得る。

# 合致する Karte が1万件あったら、IN (1万件の PK)となるのだろうか。
(追記)通常、LIMIT 制限するのでそんなことはおこらない。

※iPhone OS 3.1.3 用コードで確認