2011-01-23 2 views
3

Я только начинаю программировать на iOS, поэтому большое спасибо за терпение и помощь заранее. Я являюсь сущностью «Расход» с атрибутом (float), называемым «значением». У меня есть tableView с заполненной формой coreData с NSFetchedResultsController. Я пытаюсь показать в ярлыке (или заголовке таблицы) общую сумму «значений» всех моих «Расходов», но я не могу реализовать решение после прочтения Apple Docs и googling на разных форумах. Конечно, дезориентация новичка. Оцените любые указания о наилучшем способе реализации этого короля операций или какой-либо код, который показывает аналогичное решение.Сумма атрибута CoreData

ответ

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]; 
} 

Даже если вы не используете разделы в своей таблице, это будет работать. Но тогда вы должны изменить возвращаемую строку.

Я думаю, вы должны уметь это понять. Существует также более общий способ сделать это. Я написал вам немного более подробный для вас. Он использует 3 строки вместо 1 в for-loop, но делает то же самое.

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); 
+0

Спасибо что потратили некоторое время «fluchtpunkt», и указывая способ работы с валютами. Хорошие советы всегда приветствуются и принимаются. Моя основная проблема заключалась в том, как вычислить @Sum «значение» для всех Расходов, которые пользователь может вставить в TableView и сохранить как «Расход» объекта с атрибутом «значение» или «сумма», более правильно. Я не нашел способ вычислить общую сумму атрибута с помощью CoreData. Затем я покажу, что «Total Amount» где-то. Спасибо – Diogo

+0

Спасибо fluchtpunkt, я работал над вашим кодом, пытаясь понять его, а не просто «вставить его». Он работает по своему желанию. – Diogo

+0

Как насчет KVC ?. – Andy

Смежные вопросы