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

时间:2013-10-25 21:59:20

标签: ios iphone sorting core-data nsfetchrequest

我有以下型号:

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

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

问题#2: 此外,获取请求有resultType = NSDictionaryResultType,在返回的字典中,我想获取属性namelatestDate(所有date的最新SubEntities那个Entity)。这可能吗?

2 个答案:

答案 0 :(得分:2)

问题#1

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

我建议你采用以下方法:

首先选择SubEntity,其中包含每个Entity的最新日期(最长):

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个对象集合。 您可以直接从Entity访问SubEntity

问题#2

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

答案 1 :(得分:2)

我建议您更改模型:

latestDate属性添加到Entity 更新SubEntityentity媒体资源时,请检查SubEntity date是否为此Entity对象的最新版本,并进行相应更新。

这将允许您通过简单的查询完成所需的操作,然后您就可以使用提取的结果控制器来跟踪您的数据更改。

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