web-dev-qa-db-ja.com

複数の条件を持つNSPredicateの構成

いくつかの条件をNSPredicateに「カスケード」する方法はわかりません。

私はコアデータにかなり慣れていないので、それが私が望んでいることを達成するための正しい方法であるかどうかはわかりません。

これが私がやろうとしていることです:

LocationオブジェクトとwhereTookの関係を持つPhotoオブジェクトがあり、photosTookThereの逆です。

次に、写真にはisFavouriteというNSNumber属性があります。

最初にphotosTookThereが存在することを確認するNSFetchRequestを構成し、存在する場合は、それぞれの結果のPhotoオブジェクトを確認して、お気に入りとして設定されているもののみを返します。

これまでのコードは次のとおりです。

request.entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:context];
request.sortDescriptors = [NSArray arrayWithObject[NSSortDescriptorsortDescriptorWithKey:@"locationId" ascending:YES]];
request.predicate = [NSPredicate predicateWithFormat:@"photosTookThere.@count != 0"];

2番目の条件を述語にカスケードして正しい結果を返すにはどうすればよいですか?

29
Will

括弧の中に各条件を入れて、ANDで接続します。

[NSPredicate predicateWithFormat:@"(photosTookThere.@count != 0) AND (isFavourite == %@)", [NSNumber numberWithBool:YES]];

また、 "whereTook"関係の名前を "location"に変更し、 "photosTookThere"を単に "photos"に変更することもお勧めします。これは、慣例に沿ったものです。

63
Mark Leonard

私は最終的にサブクエリを使用してこれを解決することができました:

request.predicate = [NSPredicate predicateWithFormat:
                         @"(photosTookThere.@count !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1).@count >0"
                         ];
8
Will

SQLステートメントで "where"条件を指定する場合と同じように、述語でANDとORを使用するだけです。NULLを確認するには、次のようにします。 「whereTook」と比較する場合、nil(whereTook = nil)と比較できます。

6
pzearfoss