2011-07-31 29 views
11

Tôi có một kho dữ liệu lõi đơn giản với một thực thể Chi phí với một giá trị thuộc tính nguyên "giá trị". Tôi muốn tổng hợp tất cả các chi phí trong cửa hàng của mình, tương đương với tuyên bố sql sau:Tính tổng đơn giản với Dữ liệu chính

SELECT sum(value) FROM costs 

Làm cách nào để làm điều đó một cách hiệu quả nhất trong Cocoa Touch? Bằng cách sử dụng dữ liệu lõi? Hoặc chỉ nhận được tất cả các thực thể chi phí và thực hiện tổng kết thủ công?

Trả lời

11

Cách tốt nhất là sử dụng fetch for specific values và cung cấp NSExpressionDescription with a sum: function.

Khi bạn thực hiện tìm nạp, bạn nhận được một mảng phần tử chứa từ điển có khóa khớp với mô tả biểu thức và giá trị của nó là kết quả của biểu thức. Trong trường hợp này, bạn sẽ nhận được một khóa sum có giá trị sẽ là tổng của các thuộc tính cho biểu thức.

+0

Cảm ơn! Đây phải là cách tốt nhất để làm điều đó với cơ sở dữ liệu lớn hơn. Tuy nhiên, có rất nhiều phân bổ bộ nhớ, có thể không hiệu quả khi tìm nạp thường xuyên trên các cơ sở dữ liệu nhỏ hơn. – MrAlek

+4

Đó thực sự là bộ nhớ hiệu quả hơn vì bạn chỉ phân bổ một vài đối tượng cho hoạt động tìm nạp thay vì hàng tá hoặc nhiều đối tượng được quản lý. Điều này giữ cho các hoạt động trong cửa hàng thay vì kéo dữ liệu vào bộ nhớ. Nó giống như một hoạt động cơ sở dữ liệu thủ tục truyền thống. – TechZen

16

Có một số đặc biệt key value coding operators hoạt động trên mảng và bộ và một trong số đó là @sum. Nếu bạn lấy tất cả các đối tượng mà bạn muốn tổng hợp thành một tập gọi là costs, và nếu thuộc tính mà bạn muốn tổng hợp cho từng đối tượng là value, sau đó bạn có thể sử dụng toán tử @sum như thế này:

float theSum = [costs valueForKeyPath:@"@sum.value"]; 
+1

tôi nhận được một build thất bại với đoạn mã sau: NSSet * Chi phí = [ self.managedObjectContext fetchObjectsForEntityName: @ "LogItem" withPredicate: nil]; double summedCosts = costs. @ Sum.value; – MrAlek

+1

Tìm thấy nó nhờ liên kết của bạn, điều này đã làm việc: int summedCosts = [[cost valueForKeyPath: @ "@ sum.value"] intValue]; – MrAlek

+0

Ah, phải ... xin lỗi về điều đó. Tôi sẽ cập nhật bài đăng. – Caleb

0

Tài liệu Apple nói "Toán tử @sum trả về tổng các giá trị của thuộc tính được chỉ định bởi đường dẫn chính ở bên phải toán tử. Mỗi số được chuyển đổi thành giá trị gấp đôi, tổng các giá trị được tính toán, và tổng số được bao bọc như một thể hiện của NSNumber và được trả về. "

Điều đó đang được nói, bạn có thể sử dụng "doubleValue" thay vì "intValue" ... hoặc thậm chí bạn có thể sử dụng "floatValue" hoặc bất kỳ chuyển đổi nsnumber hợp lệ nào để có được loại bạn định làm việc.

Vì vậy, sau đây cũng sẽ làm việc lớn: `enter code here:

double sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] doubleValue]; 

hay:

float sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] floatValue]; 
Các vấn đề liên quan