2013-02-11 26 views

Trả lời

20

Có managedObjectContext:

NSManagedObjectContext *managedObjectContext = ... 

Chúng tôi tạo ra một yêu cầu lấy với từ điển kiểu trả về:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Movement class])]; 
fetchRequest.resultType = NSDictionaryResultType; 

Sau đó, chúng tôi tạo ra một mô tả biểu thức để tính toán số tiền:

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
expressionDescription.name = @"sumOfAmounts"; 
expressionDescription.expression = [NSExpression expressionForKeyPath:@"@sum.amount"]; 
expressionDescription.expressionResultType = NSDecimalAttributeType; 

Đặt thuộc tính yêu cầu để tìm nạp:

fetchRequest.propertiesToFetch = @[expressionDescription]; 

Chúng tôi cũng có thể đặt vị từ nếu muốn.

Và cuối cùng chúng tôi thực hiện yêu cầu và nhận một mảng chứa từ điển có một khóa (@ "sumOfAmounts") và giá trị của nó là một số NSNumber với tổng số tiền.

NSError *error = nil; 
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (result == nil) 
{ 
    NSLog(@"Error: %@", error); 
} 
else 
{ 
    NSNumber *sumOfAmounts = [[result objectAtIndex:0] objectForKey:@"sumOfAmounts"]; 
} 

Cheers

+1

Tại sao downvote? – e1985

+0

Xin lỗi, đây là điều xấu của tôi, tôi muốn upvote ... Plz cung cấp một chút chỉnh sửa trên bài viết của bạn để tôi có thể chuyển phiếu bầu của tôi – Yaman

+0

cảm ơn người đàn ông! hoạt động tốt! – Vins

2

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

Khi bạn thực hiện lấy bạn nhận được một mảng một yếu tố có chứa một từ điển có các khóa khớp các mô tả biểu hiện và có giá trị 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.

1

Dưới đây là một Swift ví dụ về cách tổng hợp thuộc tính một đối tượng được quản lý sử dụng NSExpressionNSExpressionDescription. Ví dụ giả định rằng đối tượng được quản lý có tên là Movement và thuộc tính tổng là amount.

Ví dụ:

func sumAmount -> Double { 

    var amountTotal : Double = 0 

    // Step 1: 
    // - Create the summing expression on the amount attribute. 
    // - Name the expression result as 'amountTotal'. 
    // - Assign the expression result data type as a Double. 

    let expression = NSExpressionDescription() 
    expression.expression = NSExpression(forFunction: "sum:", arguments:[NSExpression(forKeyPath: "amount")]) 
    expression.name = "amountTotal"; 
    expression.expressionResultType = NSAttributeType.DoubleAttributeType 

    // Step 2: 
    // - Create the fetch request for the Movement entity. 
    // - Indicate that the fetched properties are those that were 
    // described in `expression`. 
    // - Indicate that the result type is a dictionary. 

    let fetchRequest = NSFetchRequest(entityName: "Movement") 
    fetchRequest.propertiesToFetch = [expression] 
    fetchRequest.resultType = NSAttributeType.DictionaryResultType 

    // Step 3: 
    // - Execute the fetch request which returns an array. 
    // - There will only be one result. Get the first array 
    // element and assign to 'resultMap'. 
    // - The summed amount value is in the dictionary as 
    // 'amountTotal'. This will be summed value. 

    do { 
     let results = try context.executeFetchRequest(fetchRequest) 
     let resultMap = results[0] as! [String:Double] 
     amountTotal = resultMap["amountTotal"]! 
    } catch let error as NSError { 
     NSLog("Error when summing amounts: \(error.localizedDescription)") 
    } 

    return amountTotal 
} 

bổ sung Thảo luận về bước:

Bước 1 - Tạo một biến NSExpressionDescription. Điều này NSExpressionDescription cho biết loại chức năng được áp dụng cho các đối số. Hàm tổng hợp đang được áp dụng cho thuộc tính số tiền.

expression.expression = NSExpression(forFunction: "sum:", 
    arguments:[NSExpression(forKeyPath: "amount")]) 

Chú ý rằng luận tham số là một mảng . Bạn có thể vượt qua các loại biểu thức khác nhau trong mảng, nhưng trong trường hợp của chúng tôi, chúng tôi chỉ muốn thuộc tính amount.

Bước 2 - Yêu cầu tìm nạp được thiết lập tại đây. Lưu ý rằng loại kết quả được chỉ định làm từ điển: fetchRequest.resultType = NSAttributeType.DictionaryResultType. Trong Bước 3, chúng tôi sẽ sử dụng giá trị expression.name của amountTotal làm khóa để truy cập giá trị tổng hợp.

Bước 3 - Chúng tôi thực hiện yêu cầu tìm nạp và được trả lại sẽ là một mảng phần tử. Phần tử sẽ là từ điển mà chúng tôi xếp vào [String:Double]: let resultMap = results[0] as! [String:Double]. Giá trị của từ điển là Double vì trong Bước 1, chúng tôi chỉ ra rằng expression.expressionResultType sẽ là Double.

Cuối cùng, chúng tôi truy cập bằng cách gọi tổng giá trị điển kết hợp với phím amountTotal: resultMap["amountTotal"]!


Tài liệu tham khảo:

NSExpressionNSExpressionDescription

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