0

我有以下实体:

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. 保留所有团队的集合,并保留具有给定日期的所有作业的集合。只有两个查询,但需要保持第二个集合与数据库同步(assignmentCount 会改变,宁愿不这样做)

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

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

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

有任何想法吗?

4

2 回答 2

0

使用获取的结果控制器(或至少在结果中分页的获取请求)。TeamFRC 将在滚动列表时管理对象的直接更改和从存储中有效加载。

您可以配置获取请求以从您知道将始终需要的关系中预取信息。您应该使用关系来获取该信息,而不是额外的获取请求。

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

于 2013-08-23T06:37:09.033 回答
0

这是非常有效的:

1) 获取具有适当谓词的团队。

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

2)像这样访问数据:

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

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

是的,你是对的,提取不会包括没有任务的团队。如果您想按日期过滤,这将是预期的行为。

于 2013-08-23T14:32:36.467 回答