【问题标题】:Core data join table, has many through, fetched properties predicate核心数据连接表,有很多通过,获取的属性谓词
【发布时间】:2013-01-19 06:02:06
【问题描述】:

如何为将呈现用户数组的 Place 实体编写 Fetched 属性?

【问题讨论】:

    标签: ios core-data


    【解决方案1】:

    对于 Place 的提取属性 users,该属性检索所有签到与给定地点相关的用户,设置

    • “用户”获取的属性的目的地
    • 以及“ANY checkins.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"];
    

    【讨论】:

    • 如果我想根据Checkin的created_at属性对用户进行排序,如何设置排序描述符键?
    • @Subhash:我认为您不能将排序描述符添加到获取的属性中,您必须在获取用户数组后对其进行排序。 - 或者您使用普通的获取请求,您可以在其中添加排序描述符。
    • 感谢您的回复。我有一个与上面提到的类似的模型,并使用 fetch 控制器来获取数据。当我将排序键设置为 created_at 时,我收到错误消息“Exception = to-many key not allowed here”。这是 Fetch 控制器的限制吗?你上面提到的解决方案(不使用 fetch 控制器)是解决这个问题的唯一方法吗?
    • @Subhash:如果您发布自己的问题,描述实体和关系并显示您的代码和错误消息,可能会更好。这样可以更轻松地帮助您解决具体问题。
    • 我已经发布了一个单独的问题。谢谢你的帮助。 stackoverflow.com/questions/15760425/…
    【解决方案2】:

    我希望我没有正确理解您。您想要在某个地点签到的用户列表吗?

    然后你反过来做。您获取至少有一个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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多