核心数据:在一对多关系中按日期属性排序
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
,并且在返回的字典中,我想获取属性name
和latestDate
(最新的date
是SubEntities
中的Entity
)。这可能吗?
【问题讨论】:
【参考方案1】:我对你的建议是改变你的模型:
将latestDate
属性添加到Entity
更新SubEntity
.entity
属性时,检查SubEntity
date
是否是此Entity
对象的最新版本并相应更新。
这将允许您通过一个简单的查询来完成您需要的事情,然后您将能够使用获取的结果控制器来跟踪您的数据更改。
如果您无法重组模型,请查看 @Michal K 的答案,但预取您的所有 Entity
和 SubEntity
对象(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 个Entity
s 和 M 个SubEntity
s,您将有 1 次大行程到商店获取所有 N 个实体,然后 M 次行程到store 来获取每个子实体 ==> O(M) 次去商店)==> 非常糟糕的性能
触发故障时,如果数据在其缓存中可用或已预取,Core Data 不会直接进入存储。由于该问题没有指定数据的大小,也没有要求最佳性能,因此我宁愿将这些细节排除在我的回答之外。以上是关于核心数据:在一对多关系中按日期属性排序的主要内容,如果未能解决你的问题,请参考以下文章
NSArrayController 如何对一对多关系进行排序?