联合核心数据中的三个实体?

时间:2013-08-23 06:08:30

标签: iphone ios objective-c core-data

我有以下实体:

Student
  NSString name
  Team inTeam // reverse of Team.students

Team
  NSSet assignments
  NSOrderedSet students // reverse relationship of Student.inTeam

Assignment
  NSDate date // timeless date, only care about the day
  NSNumber assignmentCount
  Team inTeam // reverse of Team.assignmets

并非所有学生都是团队成员。 并非所有团队都有作业。 团队通常由2名学生组成(不超过3名)。

对于所有团队,我需要显示其成员的名称和给定日期的assignmentCount。

我可以想到不同的方法,其中3个:

  1. 获取所有团队,为每个团队查询具有给定日期的分配。这样效率不高(但几乎和我在一个查询中将一切具有assignmentCount作为故障对象的情况一样?)

  2. 保留所有团队的集合,并保留具有给定日期的所有作业的集合。只有两个查询,但需要保持第二个集合与db同步(assignmentCount将改变,而宁愿不这样做)

  3. 每次assignCount更改时重新加载数据。显然不是一个好的解决方案

  4. 有没有办法在一个查询中获取所有这些信息?

    我看到的一个问题是,如果我将谓词设置为类似ANY team.assignments.date = %@的内容,则只返回具有分配的团队。

    有什么想法吗?

2 个答案:

答案 0 :(得分:0)

使用获取的结果控制器(或至少是结果中页面的获取请求)。当滚动列表时,FRC将管理Team对象的直接更改和商店的有效加载。

您可以将获取请求配置为从您始终需要的关系中预取信息。您应该使用这些关系来获取该信息,而不是其他获取请求。

对于assignmentCount for a given date,这是新fetch的一个很好的候选者。您实际上并不需要分配,因此请使用countForFetchRequest:error:并将谓词设置为team == ...

答案 1 :(得分:0)

这非常有效:

1)使用适当的谓词获取团队。

[NSPredicate predicateWithFormat:
   @"ANY assignments.date > %@ && assigments.date < %@", 
   dateStartTime, dateEndTime];

2)访问如下数据:

NSOrderedSet *students = team.students;
NSUInteger assignments = team.assignments.count;

这就是核心数据的原因。它将在后台为您完成所有优化。如果您使用NSFetchedResultsController,它可以通知您的表格视图,无需您付出任何努力。

是的,你说得对,不包括没有作业的队伍。如果您想按日期过滤,这将是预期的行为。