2011-12-30 25 views

Trả lời

9

Có hai cách để giải quyết vấn đề này:
đầu tiên - có được dữ liệu của bạn để NSSet hoặc NSArray và sử dụng toán tử @sum:

//assume that `pens` are NSArray of Pen 
NSNumber *countSum=[pens valueForKeyPath:"@sum.count"]; 

thứ hai là sử dụng cụ lấy for specific value với thêm NSExpressionDescription với một khoản tiền. Bằng cách này khó hơn nhưng tốt hơn cho số lớn hơn của db là

+0

Grate, tôi thích cách thứ nhất. Và điều gì sẽ xảy ra nếu Bút có thêm một thuộc tính 'Màu' và tôi muốn đếm tổng số bút đỏ? – Jim

+0

Đơn giản chỉ cần xây dựng mảng chỉ với bút màu đỏ bằng cách sử dụng NSPredicate, và tổng hợp mảng này. –

+0

Cảm ơn rất nhiều ... – Jim

0

Tôi giả định tương đương với SQL bạn muốn là:

select sum(p.count) 
from pens p 
where makerName = '{whatever maker you are querying for}' 

Hãy xem post này cho mã mà bạn đang tìm kiếm.

+0

Đó không phải là Obj C code) iPhone là Obj C – Jim

10

Có, bạn có thể lấy chúng từ dữ liệu cốt lõi, thay vì tìm nạp và đánh giá kết quả. Bạn có thể thực hiện các chức năng như tổng hợp trên dữ liệu lõi bằng cách sử dụng NSExpression.

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"Count"]; 
NSExpression *sumOfCountExpression = [NSExpression expressionForFunction:@"sum:" 
               arguments:[NSArray arrayWithObject:keyPathExpression]]; 

Đối với một danh sách các chức năng mà bạn có thể sử dụng đi đây

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSExpression_Class/Reference/NSExpression.html.

Sau đó, bạn cần phải tạo đối tượng NSExpressionDescription nơi bạn đặt biểu thức tho sumOfCountExpression mà bạn vừa tạo.

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
[expressionDescription setName:@"sumOfCount"]; 
[expressionDescription setExpression:sumOfCountExpression]; 
[expressionDescription setExpressionResultType:NSDoubleAttributeType]; 

Sau đó, xây dựng yêu cầu của bạn như thường lệ và sau đó đặt thuộc tính để tìm nạp biểu thức đó.

[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]]; 

Tham khảo: Core Data Programming Guide

+2

Cần lưu ý rằng bạn cần phải đặt resultType trên NSFetchRequest thành NSDictionaryResultType và giá trị trả lại sẽ nằm trong từ điển được trả về dưới khóa 'sumOfCount' hoặc bất kỳ thứ gì bạn đặt trong setName ở trên. –

+0

@ScottAllen: Cảm ơn! Đó là sự cố và khiến tôi trở nên điên rồ, và câu trả lời này là mô tả thứ hai về cách làm điều này tôi đã thấy rằng bỏ qua chi tiết quan trọng nhỏ bé này! –

Các vấn đề liên quan