我有以下实体:
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个:
获取所有团队,为每个团队查询具有给定日期的分配。这样效率不高(但几乎和我在一个查询中将一切具有assignmentCount作为故障对象的情况一样?)
保留所有团队的集合,并保留具有给定日期的所有作业的集合。只有两个查询,但需要保持第二个集合与db同步(assignmentCount将改变,而宁愿不这样做)
每次assignCount更改时重新加载数据。显然不是一个好的解决方案
有没有办法在一个查询中获取所有这些信息?
我看到的一个问题是,如果我将谓词设置为类似ANY team.assignments.date = %@
的内容,则只返回具有分配的团队。
有什么想法吗?
答案 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
,它可以通知您的表格视图,无需您付出任何努力。
是的,你说得对,不包括没有作业的队伍。如果您想按日期过滤,这将是预期的行为。