如何计算财产?

时间:2012-01-14 12:56:14

标签: iphone ios core-data

我确定我对尝试将SQL逻辑应用于Core Data感到内疚,但即使在阅读了Apple文档后,我仍然不确定正确的方法。

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

来自appt class 的

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

1 个答案:

答案 0 :(得分:0)

杰弗里

您无法根据模型中实际不存在的属性进行提取。错误消息&#34;在实体中找不到keypath,&#34;明白地说这个。您可以通过浏览SQLite DB来自行确认,并且您将看到没有要查询的SQL的属性。因此,您的提取请求必须失败。 NSExpression *numHoursPath是一个有效的表达式。它可以在您获取它们后应用于集合。你只是不能在获取请求中使用它们。

安德鲁