ユーザーの配列を表示するPlaceエンティティのフェッチ済みプロパティをどのように記述しますか?
2 に答える
チェックインが特定の場所に関連しているすべてのユーザーを取得するPlaceのフェッチされたプロパティusers
の場合、
- フェッチされたプロパティの宛先を「ユーザー」に
- および「ANYcheckins.event==$FETCH_SOURCE」の述語
これで、場所のユーザーの配列を取得できます。
Place *place = ...;
NSArray *users = [place valueForKey:@"users"];
このフェッチされたプロパティは、次のフェッチ要求に対応します。
Place *place = ...;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY checkins.event == %@", place];
[request setPredicate:predicate];
NSArray *users = [context executeFetchRequest:request error:&error];
users
フェッチされたプロパティを動的プロパティとして宣言する場合:
@interface Place (FetchedProperties)
@property(nonatomic, retain) NSArray *users;
@end
@implementation Place (FetchedProperties)
@dynamic users;
@end
次に、プロパティ構文を使用して値を取得できます。
NSArray *users = place.users;
// instead of: NSArray *users = [place valueForKey:@"users"];
ただし、フェッチされたプロパティを使用せずに、同じ結果を(セットとして)直接取得できることに注意してください。
Place *place = ...;
NSSet *users = [place.checkins valueForKey:@"user"];
私はあなたを正しく理解したと思います。特定の場所でチェックインしたユーザーのリストが必要ですか?
次に、その逆を行います。特定のUser
が少なくとも1つあるすべてのをフェッチします。Checkin
Place
Core-Dataの用語では、このためのサブクエリが必要になります。
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(checkins, $CHECKIN, $CHECKIN.event == %@).@count > 0", place];
request.predicate = predicate;
/* and so on */
SUBQUERYに関するドキュメントはあまりありません。の議論に少し書かれていexpressionForSubquery:usingIteratorVariable:predicate:
ます。
そして、フェッチされたプロパティは、宛先エンティティUserと述語を持つPlaceエンティティにありますSUBQUERY(checkins, $CHECKIN, $CHECKIN.event == $FETCH_SOURCE).@count > 0