如何总结NSPredicate筛选的coreData属性?

时间:2011-10-18 08:49:12

标签: iphone objective-c ios core-data nsfetchedresultscontroller

您好我希望能够在我的CoreData数据库中对一个属性(rowTotal)求和,之后它被我在获取的结果控制器中的谓词过滤掉了。结果将是订单的小计。

最初我以为我可以在某种程度上只计算tableCells中显示的值,但我已经读过这个效果不好,因为100个项目可能只有10个tableCells。

我已经阅读了一个类似的问题(链接如下),该问题涉及将总和放入节标题中。我想要一个变体,我希望在adminObjectContext发生任何更改后,显示和更新总和为UILabel。

Sum a CoreData attribute

我尝试过以下代码:

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 个答案:

答案 0 :(得分:10)

顺便说一下,你可以改变这个:

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]

答案 1 :(得分:0)

  

我已经在我的代码中的多个位置尝试过,看看我是否可以让它工作。我没有成功

该代码看起来不错,假设获取请求正常并返回结果。你得到了多少结果?他们都有非零“rowTotal”属性吗?这段代码是否存在错误,或subtotal只保留0?

  

并且使用此代码在tableView中不显示数据。

假设代码有效并且subtotal是> 0,然后您必须通过其数据源方法将结果提供给表视图。

  

我应该在哪里实施代码?

- (NSFetchedResultsController *)fetchedResultsController方法放在视图控制器子类中是典型的,但不是必需的。此外,总和块可能会进入- (float)subtotal

答案 2 :(得分:0)

试试这个。它对我有用。计算基于整数..

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;

    }