Przy użyciu danych podstawowych napotkałem problem. Mam podmiot "Ruch" z atrybutem "kwota". Jak utworzyć sumę wszystkich "kwot" wszystkich wystąpień? Chciałbym zrozumieć, jak używać NSExpressionDescription, ale to wystarczająco dobre NSSet.Suma danych podstawowych wszystkich atrybutów instancji
Odpowiedz
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
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.
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:
- 1. Suma wszystkich wartości w ramce danych
- 2. Dzielnik atrybutów bez instancji?
- 3. Suma wszystkich liczb
- 4. Porównywanie dat danych podstawowych danych
- 5. NSRangeException po migracji danych podstawowych
- 6. Niestandardowa migracja danych podstawowych
- 7. Błąd danych podstawowych NSInvalidArgumentException
- 8. Dawanie błędnych danych podstawowych
- 9. Suma wszystkich poprzednich wartości? - Do tej pory suma?
- 10. iPhone: Zapisz boolean w danych podstawowych
- 11. Karta danych podstawowych "nie archiwizuj"
- 12. Jakie są "prymitywne" akcesory w danych podstawowych?
- 13. Atrybuty obliczane na podstawie danych podstawowych
- 14. Jak uzyskać listę wszystkich użytkowników baz danych instancji
- 15. Jak uruchomić to samo zapytanie we wszystkich bazach danych instancji?
- 16. Suma wszystkich wartości licznika w Pythonie
- 17. Suma iloczynu wszystkich możliwych podzbiorów macierzy
- 18. Suma wszystkich elementów tablicy tablic Javy
- 19. MATLAB suma wszystkich elementów tablicy wycenione wyrażenie
- 20. F # suma wszystkich innych elementów listy
- 21. C++: Suma wartości wszystkich węzłów drzewa binarnego
- 22. Suma wszystkich zliczeń w kolekcjach. Konto
- 23. Wykrywanie lekkiej migracji podstawowych danych
- 24. Utrzymywanie danych podstawowych w przyszłych wersjach aplikacji
- 25. Auto-inkrementowany identyfikator obiektu w danych podstawowych?
- 26. Przelotowe wszystkich instancji JavaScript Object
- 27. Jak wybrać określone dane w danych podstawowych?
- 28. Jak utworzyć obiekt NSFetchRequest, który filtruje obiekty danych podstawowych na podstawie atrybutów i relacji?
- 29. Konfigurowanie relacji podczas importowania danych podstawowych?
- 30. suma zmiennych w ramce danych R
Dlaczego downvote? – e1985
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
dzięki człowieku! działa dobrze! – Vins