【发布时间】:2013-01-19 06:02:06
【问题描述】:
如何为将呈现用户数组的 Place 实体编写 Fetched 属性?
【问题讨论】:
如何为将呈现用户数组的 Place 实体编写 Fetched 属性?
【问题讨论】:
对于 Place 的提取属性 users,该属性检索所有签到与给定地点相关的用户,设置
现在您可以获得一个地点的用户数组:
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"];
【讨论】:
我希望我没有正确理解您。您想要在某个地点签到的用户列表吗?
然后你反过来做。您获取至少有一个Checkin 和某个Place 的所有Users。
在核心数据方面,您需要一个子查询。
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:的讨论中。
获取的属性将在 Place 实体中,目标实体 User 和谓词 SUBQUERY(checkins, $CHECKIN, $CHECKIN.event == $FETCH_SOURCE).@count > 0
【讨论】: