求和核心数据属性

时间:2011-01-23 15:30:34

标签: core-data

我刚刚开始使用iOS编程,非常感谢您提前耐心和帮助。 我是一个实体“Expense”,其属性(float)称为“value”。我有一个tableView填充表单coreData与NSFetchedResultsController。 我试图在标签(或表格标题)中显示所有“费用”的“值”的总和,但在阅读Apple Docs并在Google上搜索不同的论坛后,我无法实现解决方案。肯定是初学者迷失方向。 欣赏有关实施此操作之王的最佳方法的任何迹象,或任何显示类似解决方案的代码。

1 个答案:

答案 0 :(得分:8)

首先。如果要计算和存储货币,则应使用Decimal(nsdecimalnumber的核心数据名称)和NSDecimalNumber。 我用float实现了你需要的代码。但是你应该把它改成NSDecimalNumber。阅读this以了解您应该这样做的原因

如果要将费用值添加到节标题中,则很容易。你基本上花费了部分中所有对象的费用并总结了它。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    float expense = 0;
    for (NSManagedObject *object in [sectionInfo objects]) {
        expense += [[object valueForKey:@"expense"] floatValue];
    }
    return [NSString stringWithFormat:@"%@ [Expense: %f]", [sectionInfo name], expense];
}

即使你不使用表中的部分,这也行。但是你应该改变返回的字符串。

我认为你应该能够理解它。还有一种更通用的方法可以做到这一点。我为你写了一点点冗长。它在for循环中使用3行而不是1行,但它完全相同。

float expense = 0;
for (NSManagedObject *object in [self.fetchedResultsController fetchedObjects]) {
    NSNumber *objectExpenseNumber = [object valueForKey:@"expense"];
    float objectExpense = [objectExpenseNumber floatValue];
    expense = expense + objectExpense;
}
NSLog(@"Expense: %f", expense);

没有太多解释。

编辑:如果您使用NSDecimalNumber

,这将是代码
NSDecimalNumber *expense = [NSDecimalNumber decimalNumberWithString:@"0"];
for (NSManagedObject *object in [self.fetchedResultsController fetchedObjects]) {
    NSDecimalNumber *objectExpenseNumber = [object valueForKey:@"expense"];
    expense = [expense decimalNumberByAdding:objectExpenseNumber];
}
NSLog(@"Expense: %@", expense);