核心数据谓词与组和MAX()

时间:2010-07-07 17:08:44

标签: iphone core-data

核心数据中有一个对象有2个字段:Name和Date。每次有人签到时,都会保存他们的姓名和时间。

有没有办法使用核心数据中的谓词来获取所有唯一身份列表的最后一次检查?

注意:我知道2个表会让它更容易。

这个的SQL将是

select 
    clientName
    , MAX(ModifiedDate) 
from
    Client
group by 
    clientName

2 个答案:

答案 0 :(得分:4)

从iOS 5.0开始,OS X 10.7 NSFetchRequest类包含setPropertiesToGroupBy:实例方法,允许在持久存储级别创建聚合请求。

您必须将NSDictionaryResultType设置为结果类型,从而告诉NSFetchRequest对象返回带有聚合数据而不是托管对象的NSDictionary个对象。

max()请求的示例代码:

[request setResultType:NSDictionaryResultType];

NSExpression *dateKeyExpression = [NSExpression expressionForKeyPath:@"date"];
NSExpression *maxDateExpression = [NSExpression expressionForFunction:@"max:" arguments:[NSArray arrayWithObject:dateKeyExpression]];
NSExpressionDescription *maxDateED = [[NSExpressionDescription alloc] init];
[maxDateED setExpression:maxDateExpression];
[maxDateED setName:@"maxDate"];
[maxDateED setExpressionResultType:NSDateAttributeType];

NSAttributeDescription *clientName = [[self entityDescription].attributesByName objectForKey:@"clientName"];
[request setPropertiesToFetch:[NSArray arrayWithObjects:clientName, maxDateED, nil]];
[request setPropertiesToGroupBy:[NSArray arrayWithObject:clientName]];

答案 1 :(得分:2)

不容易,因为Core Data首先是对象图。您可以通过抓取一组不同的名称,然后通过排序查询每个名称的最大值来实现。

最好的答案是将其分成两个表,否则每次尝试解决此问题时计算成本都会很高。

OR / M层

不要将其视为OR / M层。核心数据是一个对象图;完全停止。

它碰巧持久化到数据库结构,因为它的一个持久性选项是次要的。

您的问题中的问题是您正在尝试将对象图用作数据库。在那种情况下,我会使用一个经常归因于我的阶段:

“你做错了。” :)