核心数据连接表,有许多通过,提取属性谓词

时间:2013-01-19 06:02:07

标签: ios core-data

Xcode Data Model 如何为将提供用户数组的场所实体编写一个获取属性?

2 个答案:

答案 0 :(得分:16)

对于 Place 的已获取属性users,它会检索其签到与指定位置相关的所有用户,请设置

  • 已取物品的目的地为"用户"
  • 和谓词到" ANY checkins.event == $ FETCH_SOURCE"

enter image description here

现在你可以获得一个地方的用户数组:

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

的Place实体中