【问题标题】:Core Data, how to limit on an attribute?Core Data,如何限制属性?
【发布时间】:2017-11-28 04:14:13
【问题描述】:

我有一个教师实体和一个学生实体。老师可以有很多学生。我如何为所有教师获取信息,但每位教师只能有 5 个学生?

entity =[NSEntityDescription entityForName:@"Teacher" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[context executeFetchRequest:fetchRequest error:nil];

返回所有教师及其所有学生。如何限制/偏移属性? (学生)

【问题讨论】:

  • 您不能在获取引用实体期间设置限制。如果您只想显示 5 个学生,只需在显示时执行即可
  • @Paulw11 感谢您的帮助。内存消耗呢?教师可以拥有数百万学生,为什么只需要 5 个就获取/加载所有这些。有没有办法不获取引用的实体?
  • 百万?我原以为一位老师在整个职业生涯中最多可能有数千名学生。无论如何,默认情况下,Core Data 会将相关学生作为故障获取;在您访问该对象之前,不会获取整个记录。因此,如果您获取所有学生但只访问前 5 个学生,那么实际上只会获取前 5 个学生。
  • @Paulw11 谢谢。所以没有学生在使用之前被加载到内存中?因为每个学生对象都可能很大,因为它也有数百万的朋友和东西。你是说基本上没有必要限制这些数据,因为 Core Data 有内置的功能来帮助它?
  • 如果您认真谈论拥有数亿条记录,那么您可能不应该在设备上保存这些数据;它应该在某个服务器上,应用程序只是通过网络查询它。您可以在此处阅读有关错误关系的信息 - developer.apple.com/documentation/coredata/nsfetchrequest/…

标签: ios objective-c core-data


【解决方案1】:

要根据与students 的关系计数限制结果,请使用包含@count 聚合运算符的提取谓词。那看起来像

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"students.@count < 5"];
[fetchRequest setPredicate:predicate];

这将根据students 关系中的对象数量过滤结果。 Teacher 可能有任意数量的学生,但这只会得到少于 5 个的学生。

【讨论】:

  • 感谢您的帮助,我真正需要的是所有老师,但每个老师只返回 5 个学生。真的没有办法做到这一点吗? (除了获取所有并手动进入每个对象并选择 5)
  • 你会用什么测试来选择这 5 个?您想要的 5 人与其他人的区别是什么?
  • 任何启发式作品,可以是随机的5个,也可以是最新的5个;没关系。我每次只需要 5 名学生,而不是 500 万。我想要的是:“所有老师和每个老师不超过 5 名学生”。想法?
猜你喜欢
  • 1970-01-01
  • 2015-02-20
  • 2011-07-26
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多