【问题标题】:How to get Total Sum of all entries in a Core Data attribute?如何获取核心数据属性中所有条目的总和?
【发布时间】:2015-01-28 20:31:42
【问题描述】:

我有一个包含一个实体和几个属性的核心数据数据模型。

其中一个属性是一个整数 16 (NSDecimalNumber),称为

numberOfSeconds

我想从这个属性中找到我的数据模型中所有条目的总和。

换句话说:我将在此属性中包含许多用户条目。假设用户创建了 3 个具有这些细节的条目:

1) numberOfSeconds = 4

2) numberOfSeconds = 2

3) numberOfSeconds = 5

我希望能够获得应该等于11的总和。

感谢任何帮助!

【问题讨论】:

    标签: objective-c iphone database xcode core-data


    【解决方案1】:

    您可以使用NSExpressionDescription 直接通过获取请求获取总和(无需获取托管对象本身,如果您有很多托管对象,效率可能会很低)。

    记得为获取请求设置NSDictionaryResultType(如果我没有这样做,我会得到 EXC_BAD_ACCESS)。

    NSExpression *keyExpression = [NSExpression expressionForKeyPath:@"numberOfSeconds"];
    NSExpression *sumExpression = [NSExpression expressionForFunction:@"sum:" arguments:@[keyExpression]];
    
    NSExpressionDescription *sumDescription = [[NSExpressionDescription alloc] init];
    sumDescription.name = @"sumOfSeconds";
    sumDescription.expression = sumExpression;
    [sumDescription setExpressionResultType:NSDecimalAttributeType];
    
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
    request.resultType = NSDictionaryResultType;
    [request setPropertiesToFetch:@[sumDescription]];
    
    NSError *error = nil;
    NSManagedObjectContext *context = ... //get the context somehow
    NSArray* fetchResult = [context executeFetchRequest:request error:&error];
    NSNumber *sum = fetchResult.firstObject[sumDescription.name];  //this is your sum
    

    参考:Apple Core Data guide

    【讨论】:

      【解决方案2】:

      看看Collection Operators - 它类似于 SQL 聚合函数。

      假设您之前将实体提取到某个集合 entitiesCollection

      然后它应该看起来像: NSNumber *result = [entitiesCollection valueForKeyPath:@"@sum.numberOfSeconds"]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-24
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        相关资源
        最近更新 更多