代码之家  ›  专栏  ›  技术社区  ›  AlexR

对核心数据属性/列执行基本计算

  •  1
  • AlexR  · 技术社区  · 13 年前

    我使用的是基于核心数据的时间序列(实体/表),它由以下属性/列组成:

    dateTime mc nd re
    

    基于公式 result = (mc + nd) / re 我想计算每一行的结果,并在数组中返回结果(dateTime+value)。

    我尝试了以下代码在数据库级别上执行计算,但在结果数组中确实得到了错误的结果(每行有多个dateTime值,计算结果错误)。然而 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);
    
    1 回复  |  直到 13 年前
        1
  •  2
  •   Martin R    13 年前

    这似乎是核心数据中的一个错误。如果设置启动参数“-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];
    

    它返回预期的结果。