1

次の属性/列で構成される Core Data ベースの時系列 (エンティティ/テーブル) を使用しています。

dateTime mc nd re

数式に基づいて、result = (mc + nd) / re各行の結果を計算し、結果 (dateTime + 値) を配列で返したいと思います。

データベース レベルで計算を実行するために次のコードを試しましたが、結果配列で間違った結果が得られました (行ごとに複数の dateTime 値、間違った計算結果)。ただし、NSExpressionDescriptionNSLogging を行うと、正しい式が返されます。

私のコードの何が問題なのか、何か考えはありますか?

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);
4

1 に答える 1

2

これは Core Data のバグのようです。起動引数「-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];

期待される結果を返します。

于 2013-03-28T14:45:56.283 に答える