2013-03-28 51 views
1

我使用核心數據的基於時間系列(實體/表)由以下屬性/列組成:上核心數據的屬性執行基本的計算/列

dateTime mc nd re 

根據公式result = (mc + nd)/re我想計算每行的結果並返回數組中的結果(日期時間+值)。

我嘗試下面的代碼在數據庫級別進行計算,但也得到(每行的多個日期時間值,錯誤的計算結果),在我的結果陣列錯誤的結果。然而,NSExpressionDescription NSLogging當它返回正確的公式。

你有什麼可能是錯我的代碼什麼想法?

NSString *divisorKeyPath = @"revenue" 
NSExpression *marketCapExpression = [NSExpression expressionForKeyPath:@"mc"]; 
NSExpression *netDebtExpression = [NSExpression expressionForKeyPath:@"nd"]; 
NSExpression *divisorExpression = [NSExpression expressionForKeyPath: 
    divisorKeyPath]; 
NSExpression *evExpression  = [NSExpression expressionForFunction: 
    @"add:to:" 
    arguments:@[marketCapExpression,netDebtExpression]]; 
NSExpression *divisionExpression = [NSExpression expressionForFunction: 
    @"divide:by:" 
    arguments:@[evExpression, divisorExpression]]; 
NSString *divisionExpressionName = @"division"; 
NSExpressionDescription *divisionDescription = [[NSExpressionDescription alloc] init]; 
divisionDescription.name      = divisionExpressionName; 
divisionDescription.expression    = divisionExpression; 
divisionDescription.expressionResultType  = NSDoubleAttributeType; 

NSFetchRequest *divisionRequest = [NSFetchRequest fetchRequestWithEntityName: 
    NSStringFromClass([SharePrice class])]; 
divisionRequest.propertiesToFetch = @[@"dateTime",divisionDescription]; 
divisionRequest.resultType = NSDictionaryResultType; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor 
    sortDescriptorWithKey:@"dateTime" ascending:YES]; 
divisionRequest.sortDescriptors = @[sortDescriptor]; 

NSError *error; 
NSArray *divisionResults = [self.managedDocument.managedObjectContext 
    executeFetchRequest:divisionRequest error:&error]; 
NSLog(@"results: %@",divisionResults); 

回答

2

這似乎是核心數據中的一個錯誤。如果您設置啓動參數「-com.apple.CoreData.SQLDebug 3」,那麼你可以看到,表達描述,因爲它應該轉換爲SQLite的查詢

SELECT t0.ZDATETIME, t0.ZMARKETCAP + t0.ZNETDEBT/t0.ZREVENUE FROM ZENTITY t0 ORDER BY t0.ZDATETIME 

,而不是

SELECT t0.ZDATETIME, (t0.ZMARKETCAP + t0.ZNETDEBT)/t0.ZREVENUE FROM ZENTITY t0 ORDER BY t0.ZDATETIME 

是。

divisionExpression本身是正確的。如果你將它應用到你的實體的一個sharePrice對象,使用

NSNumber *x = [expression expressionValueWithObject:sharePrice context: nil]; 

返回預期的結果。