Как можно суммировать атрибуты coreData, отфильтрованные по NSPredicate? - PullRequest
0 голосов
/ 18 октября 2011

Здравствуйте, я хочу иметь возможность суммировать атрибут (rowTotal) в моей базе данных CoreData после того, как он был отфильтрован предикатом, который я установил в контроллере полученных результатов.Тогда результатом будет промежуточный итог для заказа.

Сначала я думал, что смогу как-то просто суммировать значения, которые отображаются в tableCells, но я прочитал, что это не работает, так как может быть только 10tableCells для 100 элементов.

Я прочитал аналогичный вопрос (ссылка ниже), который относится к размещению суммы в заголовке раздела.Мне нужен вариант, в соответствии с которым я хочу, чтобы сумма отображалась и обновлялась до UILabel после любых изменений в managedObjectContext.

Сумма атрибута CoreData

Я пыталсяследующий код:

float subtotal = 0;
for (NSManagedObject *object in [self.fetchedResultsController fetchedObjects]) {
NSNumber *objectRowTotalNumber = [object valueForKey:@"rowTotal"];
float objectRowTotal = [objectRowTotalNumber floatValue];
subtotal = subtotal + objectRowTotal;
}
NSLog(@"Subtotal: %f", subtotal);

Я пробовал его в нескольких местах в моем коде, чтобы посмотреть, смогу ли я заставить его работать.У меня не было успеха, и данные не отображаются в tableView с этим кодом.Я думаю, что следующая строка вызывает у меня горе.

for (NSManagedObject *object in [self.fetchedResultsController fetchedObjects])

Я чувствую, что на самом деле создается новый управляемый объект и мешает тому, который у меня на месте.

Здеськод для моего выбранного контроллера результатов

- (NSFetchedResultsController *)fetchedResultsController {
NSLog(@"I'm inside the method fetchedResultsController");


/*
 Set up the fetched results controller.
 */
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
OrderAppDelegate *appDelegate = 
(OrderAppDelegate*) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Order" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

// Set the Predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"orderNumber == %@", orderNumberLabel.text];
NSLog(@"predicate is: %@",predicate);
[fetchRequest setPredicate:predicate];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;


[aFetchedResultsController release];
[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];

return fetchedResultsController;
} 

Использую ли я правильный код для этого приложения?ты видишь что я делаю не так?Где я должен реализовывать код?

Любое руководство будет высоко ценится, спасибо.

Ответы [ 3 ]

10 голосов
/ 20 октября 2011

Кроме того, вы можете изменить это:

float subtotal = 0;
for (NSManagedObject *object in [self.fetchedResultsController fetchedObjects]) {
    NSNumber *objectRowTotalNumber = [object valueForKey:@"rowTotal"];
    float objectRowTotal = [objectRowTotalNumber floatValue];
    subtotal = subtotal + objectRowTotal;
}
NSLog(@"Subtotal: %f", subtotal);

К этому:

CGFloat subtotal = [[[[self fetchedResultsController] fetchedObjects] valueForKeyPath:@"@sum.rowTotal"] floatValue]
0 голосов
/ 17 декабря 2014

Попробуй это.Для меня это сработало.Расчет основан на целых числах ..

int sum=0;
    for(NSManagedObject *object in self.runArray) {
        int value = [[object valueForKey:@"distance"] intValue];
        sum += value;

    }

Если вы хотите сделать сумму с десятичными числами, вы можете сделать то же самое, но меняя целые числа на двойное значение

double sum=0;
    for(NSManagedObject *object in self.runArray) {
        double value = [[object valueForKey:@"distance"] doubleValue];
        sum += value;

    }
0 голосов
/ 18 октября 2011

Я пробовал это в нескольких местах в моем коде, чтобы посмотреть, смогу ли я заставить его работать.У меня не было успеха

Этот код выглядит хорошо для меня, при условии, что запрос на выборку в порядке и возвращает результаты.Сколько результатов вы получаете?Все ли они имеют ненулевое свойство rowTotal?Произошла ли ошибка в этом коде или subtotal просто остается 0?

, и данные не отображаются в tableView с этим кодом.код работает, и subtotal равен> 0, вам нужно будет предоставить результат в табличное представление с помощью методов источника данных.

Где я должен реализовать код?

Было бы типичным, но не обязательным, поместить ваш метод - (NSFetchedResultsController *)fetchedResultsController в ваш подкласс контроллера представления.Кроме того, сумма суммирования может войти, возможно, - (float)subtotal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...