如何为将提供用户数组的场所实体编写一个获取属性?
答案 0 :(得分:16)
对于 Place 的已获取属性users
,它会检索其签到与指定位置相关的所有用户,请设置
现在你可以获得一个地方的用户数组:
Place *place = ...;
NSArray *users = [place valueForKey:@"users"];
此fetched属性对应于以下获取请求:
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"];
答案 1 :(得分:2)
我希望我能正确理解你。您想要在某个地方签到的用户列表吗?
然后你反过来做。您获取至少有一个User
且具有特定Checkin
的所有Place
。
在核心数据术语中,您需要一个子查询。
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和谓词SUBQUERY(checkins, $CHECKIN, $CHECKIN.event == $FETCH_SOURCE).@count > 0