【问题标题】:Core data predicate with group and MAX()带有组和 MAX() 的核心数据谓词
【发布时间】:2010-07-07 17:08:43
【问题描述】:

我在核心数据中有一个对象,它有 2 个字段:名称和日期。每次有人签入时,都会保存他们的姓名和时间。

有没有办法使用核心数据中的谓词来获取所有唯一人员的列表以及他们最后一次签到的时间?

注意:我知道两张表会更容易。

用于此的 sql 将是

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

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    从 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]];
    

    【讨论】:

      【解决方案2】:

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

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

      OR/M 层

      不要将其视为 OR/M 层。 Core Data 是一个对象图;句号。

      它恰好作为其持久性选项之一持久保存到数据库结构这一事实是次要的。

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

      “你做错了。” :)

      【讨论】:

      • 我就是这么想的。没有什么比另一个 OR/M 层更容易了:)。
      • 我会更进一步说,如果您认为 Core Data 使用表,那您就错了。实体看起来很像表格,但以这种方式思考它们会导致不恰当的数据库风格思考。
      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多