【问题标题】:Performing basic calculations on Core Data attributes / columns对核心数据属性/列执行基本计算
【发布时间】:2013-03-18 23:51:11
【问题描述】:

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

dateTime mc nd re

基于公式result = (mc + nd) / re我想计算每一行的结果,并将结果(日期时间+值)返回到一个数组中。

我尝试使用以下代码在数据库级别执行计算,但在我的结果数组中得到错误的结果(每行多个 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);

【问题讨论】:

    标签: ios objective-c sqlite core-data nsfetchrequest


    【解决方案1】:

    这似乎是 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];
    

    它返回预期的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多