2012-01-14 92 views
1

我敢肯定我對嘗試將SQL邏輯應用於核心數據感到內疚,但即使在閱讀Apple文檔後,我仍然不確定正確的方法。如何計算一個計算出的屬性?

總結核心數據實體中兩個日期屬性差異的最佳策略是什麼?我在「appt」類中有一個「numHours」計算屬性,但不在xcdatamodel中。下面的代碼失敗,出現「在實體中找不到鍵盤路徑」錯誤。非常感謝您的任何建議。

從聘任類

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

回答

0

傑弗裏的總和,

你無法獲取基於一個屬性,它實際上不是在模型。錯誤消息「在實體中找不到keypath」,清楚地說明了這一點。您可以通過瀏覽SQLite數據庫來確認這一點,您會看到沒有要查詢的SQL的屬性。因此,您的提取請求必須失敗。 NSExpression *numHoursPath是一個有效的表達式。它可以在您獲取它們後應用於收藏。你不能在提取請求中使用它們。

Andrew