2013-10-25 164 views
1

按日期排序属性我有以下模式:核心数据:在对多关系

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

问题#1: 我有Entities一提取请求。我想按每个Entity中所有SubEntities的最新date排序取回。我会怎么做?

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

回答

2

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

一个latestDate属性添加到Entity 当更新SubEntityentity属性,请检查SubEntitydate是否为此最新的Entity对象并进行相应更新。

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

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

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

问题#2

据我知道你不能做到这一点的方式。您可以使用上述解决方案访问这些元素。

+1

这将在整个数据集中发生错误(如果您有N个实体和M个实体,您将有1次大的行程到达商店以获取所有N个实体,然后M前往商店获取每个子实体实体==> O(M)到商店的行程)==>性能很差 –

+0

发生故障时,如果数据在其高速缓存中可用或预取,Core Data不会直接进入存储区。由于问题没有具体说明数据的大小,也没有要求获得最佳性能,所以我更愿意将这些细节放在我的答案之外。 –