0

안녕 페치 된 결과 컨트롤러에서있는 위치에있는 술어에 의해 필터링 된 후 내 CoreData 데이터베이스에서 특성 (rowTotal) 합계 수 싶습니다. 그 결과는 주문의 부분합이됩니다.어떻게 NSPredicate로 필터링 된 coreData 속성을 합산 할 수 있습니까?

처음에는 tableCells에 표시되는 값을 어떻게 든 합계 할 수 있다고 생각했지만 100 개 항목에 대해 10 개의 tableCell 만있을 수 있으므로이 방법이 제대로 작동하지 않는다는 점을 읽었습니다.

섹션 헤더에 합계를 넣는 것과 관련된 비슷한 질문 (아래 링크)을 읽었습니다. 내가 그 변화를 원한다면 나는 합계를 표시하고 UILabel에 어떤 변화가 managedObjectContext에 발생하기를 원한다. 내가이 일을 얻을 수 있는지 확인하기 위해 내 코드에서 여러 위치에 그것을 시도

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

:

Sum a CoreData attribute

나는 다음과 같은 코드를 시도했습니다. 나는 성공하지 못했으며이 코드로 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; 
} 

나는이 응용 프로그램에 적합한 코드를 사용하고 코드입니다? 내가 잘못하고있는 것을 볼 수 있니? 코드를 어디에 구현해야합니까?

모든 안내를 주시면 감사하겠습니다.

답변

0

코드를 여러 위치에서 시도해 보았습니다. 제대로 작동하는지 확인할 수 있습니다. 나는 아무런 성공도 얻지 못했습니다.

가져 오기 요청이 OK이고 결과가 반환된다고 가정하면이 코드는 나에게 잘 어울립니다. 얼마나 많은 결과가 있습니까? 그들은 모두 0이 아닌 "rowTotal"속성을 갖고 있습니까? 이 코드에서 오류가 발생했거나 subtotal이 0으로 남아 있습니까?

데이터는이 코드가있는 tableView에 표시되지 않습니다.

코드가 작동하고 subtotal이> 0이라고 가정하면 데이터 원본 메서드를 통해 테이블보기에 결과를 제공해야합니다.

어디에서 코드를 구현해야합니까?

- (NSFetchedResultsController *)fetchedResultsController 메서드를보기 컨트롤러 하위 클래스에 넣는 것이 일반적이지만 필수는 아닙니다. 또한 합계 덩어리는 아마도 - (float)subtotal이 될 수 있습니다.

여담으로
+0

그냥 0으로 유지 double 값으로 동일하지만, 변화하는 정수 작업을 수행 할 수 있습니다 ... 정수를 기반으로하지만,있다 그 이유는 어떤 이유로 루프에서 코드를 실행하지 않는다는 것입니다. 따라서 소계는 설정 한 값으로 유지됩니다. 가져 오기 요청은 결과를 반환하고 추가 및 삭제할 수 있습니다. 모두 "rowTotal"속성이> 0이고 오류가 발생하지 않습니다. – msec

+0

Ahhhh : D가 문제를 해결했습니다. for (self.fetchedResultsController fetchedObjects의 NSManagedObject * 객체)에서'self '를 제거하고 이제 의도 한대로 작동합니다. '자기'가 왜 내 자신의 이해를 위해서만 효과가 있었는지 내게 말할 수 있겠습니까? – msec

+0

'self.fetchedResultsController '를 호출하면 자신이 직접 작성했거나 @ property/@ synthesize를 통해 작성한 액세서 메소드를 통해 FRC에 액세스하고 있음을 의미합니다. 그냥'fetchedResultsController'를 호출하면 접근자를 통하지 않고 FRC 인스턴스 변수 ("ivar")에 직접 액세스하는 것입니다. 귀하의 경우, 나는 왜 하나가 작동하는지 다른 하나는 모르겠다 - 뭔가 어쩌면 엉망입니다. – alexantd

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

    } 
관련 문제