【问题标题】:How to sum on a calculated property?如何对计算的属性求和?
【发布时间】:2012-01-14 12:56:14
【问题描述】:

我确信我试图将 SQL 逻辑应用于 Core Data 是有罪的,但即使在阅读了 Apple 文档之后,我仍然不确定正确的方法。

对 Core Data 实体中两个日期属性的差异求和的最佳策略是什么?我在“appt”类上有一个“numHours”计算属性,但在 xcdatamodel 中没有。下面的代码失败,出现“在实体中找不到密钥路径”错误。非常感谢您的任何建议。

来自 appt 类

- (float)numHours {
    float hours = ([self.endTime timeIntervalSinceDate:self.startTime] - [self.durationOfBreak intValue]) / 3600.00;
    return hours;
}

尝试获取“numHours”属性的总和

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"appt" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSPredicate *datePredicate = [NSPredicate predicateWithFormat:@"date >= %@ && date < %@", self.startDate, self.endDate];
[request setPredicate:datePredicate];
[request setResultType:NSDictionaryResultType];

NSExpression *numHoursPath = [NSExpression expressionForKeyPath:@"numHours"];
NSExpression *hoursSum = [NSExpression expressionForFunction:@"sum:"
                                                   arguments:[NSArray arrayWithObject:numHoursPath]];

NSExpressionDescription *debitExpressionDescription = [[NSExpressionDescription alloc] init];
[debitExpressionDescription setName:@"totalhours"];
[debitExpressionDescription setExpression:hoursSum];
[debitExpressionDescription setExpressionResultType:NSDecimalAttributeType];
[request setPropertiesToFetch:[NSArray arrayWithObject:debitExpressionDescription]];
[debitExpressionDescription release];

NSError *error = nil;
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error]; 

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    杰弗里,

    您无法根据模型中实际不存在的属性进行获取。错误消息“实体中未找到密钥路径”清楚地说明了这一点。您可以通过浏览 SQLite DB 自己确认这一点,您会看到 SQL 没有要查询的属性。因此,您的 fetch 请求必须失败。 NSExpression *numHoursPath 是一个有效的表达式。它可以在您获取集合后应用于集合。您不能在获取请求中使用它们。

    安德鲁

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2013-06-26
      • 2022-01-19
      • 2016-11-27
      • 2010-11-23
      • 2019-09-12
      • 1970-01-01
      相关资源
      最近更新 更多