核心数据:在一对多关系中按日期属性排序

Posted

技术标签:

【中文标题】核心数据:在一对多关系中按日期属性排序【英文标题】:Core Data: sorting by date attribute in a to-many relationship 【发布时间】:2013-10-25 21:59:19 【问题描述】:

我有以下型号:

  Entities:  Entity <----------->> SubEntity
++++++++++++++++++++++++++++++++++++++++++++++++
Attributes:  >name                 >uuid
             >identifier           >date

问题 #1: 我有一个Entities 的获取请求。我想按每个Entity 中所有SubEntities 中的最新date 对获取进行排序。我该怎么做?

问题 2: 此外,获取请求具有resultType = NSDictionaryResultType,并且在返回的字典中,我想获取属性namelatestDate(最新的dateSubEntities 中的Entity)。这可能吗?

【问题讨论】:

【参考方案1】:

我对你的建议是改变你的模型:

latestDate 属性添加到Entity 更新SubEntity.entity 属性时,检查SubEntity date 是否是此Entity 对象的最新版本并相应更新。

这将允许您通过一个简单的查询来完成您需要的事情,然后您将能够使用获取的结果控制器来跟踪您的数据更改。

如果您无法重组模型,请查看 @Michal K 的答案,但预取您的所有 EntitySubEntity 对象(2 个请求),然后才使用他的算法。

【讨论】:

【参考方案2】:

问题 #1

我认为你不能在集合关系上使用NSSortDescriptor 来做到这一点。您可以对其进行子查询,但它们仅过滤对象;他们不会对它们进行排序。

我会向您推荐以下方法:

首先为每个Entity 选择SubEntity 的最新日期(最大值):

NSArray *entities = ... // fetch here all your entities

NSMutableArray *result = [NSMutableArray array];
for (Entity *entity in entities) 
  SubEntity *max = [[entity subEntities] valueForKeyPath:@"@max.date"];
  if (max) [result addObject:max];

然后简单地订购result数组:

id sort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
result = [[result sortedArrayUsingDescriptors:@[sort]] mutableCopy];

您最终会得到一组按日期排序的SubEntity 对象。 可以直接从SubEntity访问Entity

问题 #2

据我所知,你不能那样做。您可以使用上述解决方案访问这些元素。

【讨论】:

这将导致整个数据集出错(如果您有 N 个Entitys 和 M 个SubEntitys,您将有 1 次大行程到商店获取所有 N 个实体,然后 M 次行程到store 来获取每个子实体 ==> O(M) 次去商店)==> 非常糟糕的性能 触发故障时,如果数据在其缓存中可用或已预取,Core Data 不会直接进入存储。由于该问题没有指定数据的大小,也没有要求最佳性能,因此我宁愿将这些细节排除在我的回答之外。

以上是关于核心数据:在一对多关系中按日期属性排序的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:重启时排序的一对多关系

核心数据以一对多关系排序

NSArrayController 如何对一对多关系进行排序?

核心数据 - 从一对多关系中检索属性

根据一对多关系中的属性对 NSFetchRequest 进行排序?

核心数据 - 具有一对多关系的实体正在检索除“关系”实体之外的所有实体对象的属性