2013-02-11 10 views

Odpowiedz

20

Posiadanie managedObjectContext:

NSManagedObjectContext *managedObjectContext = ... 

Tworzymy żądanie pobierał ze słownika Zwraca typ:

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

Następnie tworzymy opis wyrażenie obliczyć sumę:

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

Ustaw właściwości żądania do pobrania:

fetchRequest.propertiesToFetch = @[expressionDescription]; 

Możemy również ustawić predykat, jeśli chcemy.

Na koniec wykonujemy żądanie i otrzymujemy tablicę zawierającą słownik z jednym kluczem (@ "sumOfAmounts"), a jego wartością jest NSNumber z sumą kwot.

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

Dlaczego downvote? – e1985

+0

Przepraszam, to jest moje złe, chciałem upvote ... Plz zapewnić trochę edycji na swoim poście, więc mogę zmienić mój głos – Yaman

+0

dzięki człowieku! działa dobrze! – Vins

2

Najlepszym sposobem jest użycie fetch for specific values i dostarczyć NSExpressionDescription with a sum: function.

podczas wykonywania sprowadzić można uzyskać tablicę jeden element zawierający słownika którego klucze pasują do opisów ekspresja i których wartości są wyniki wyrażeń. W takim przypadku otrzymasz klucz sum, którego wartość byłaby sumą atrybutów danego wyrażenia.

1

Oto Swift przykładem zsumowanie atrybut zarządzanego obiektu przy użyciu NSExpression i NSExpressionDescription. W przykładzie założono, że obiekt zarządzany nosi nazwę Movement, a atrybutem do sumy jest amount.

przykład:

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 
} 

dodatkowe Omówienie kroki:

Etap 1 - Tworzenie zmiennej NSExpressionDescription. Ten NSExpressionDescription wskazuje, jaki typ funkcji zostanie zastosowany do argumentów. Funkcja suma jest stosowana do atrybutu kwota.

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

Należy zauważyć, że argumentyparametr jest Tablica. Możesz przekazywać różne typy wyrażeń w tablicy, ale w naszym przypadku chcemy tylko atrybutu amount.

Krok 2 - Tutaj ustawia się żądanie pobrania. Zwróć uwagę, że typ wyniku jest określony jako słownik: fetchRequest.resultType = NSAttributeType.DictionaryResultType. W kroku 3 użyjemy wartości expression.name z amountTotal jako klucza dostępu do wartości zsumowanej.

Krok 3 - Wykonujemy żądanie pobierania, a zwrócona zostanie tablica jednoelementowa. Elementem będzie słownik, który kastrujemy pod adresem [String:Double]: let resultMap = results[0] as! [String:Double]. Wartość słownika to Double, ponieważ w kroku 1 wskazaliśmy, że expression.expressionResultType będzie Double.

Wreszcie mamy dostęp poprzez wywołanie sumę wartości słownika skojarzonego z kluczem amountTotal: resultMap["amountTotal"]!


Referencje:

NSExpression i NSExpressionDescription

Powiązane problemy