Core data fetch Datensätze Gruppe von Beziehung?
Ich habe zwei Entitäten benannt Expenses
und ExpensesCategory
die Expenses
hat eine Beziehung mit CategoryExpenses
mit folgenden Attributen
name-expenseCategory, Ziel - ExpensesCategory, inverse - Kosten.
die ExpensesCategory
hat ein Attribut mit dem Namen expenseCategory der string-Typ und Expenses
hat ein Attribut namens Betrag.
Jetzt will ich fetch Ausgaben Gruppiert nach expenseCategory mit der Summe auf dem Betrag.
hier ist mein code
NSSortDescriptor *sortTitle =[NSSortDescriptor sortDescriptorWithKey:@"addedTimestamp"
ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortTitle, nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense"
inManagedObjectContext:context];
NSPredicate *predicate;
predicate =[NSPredicate predicateWithFormat:@"(addedTimestamp <= %@) AND (addedTimestamp >= %@)",currentDate, endDate];
NSAttributeDescription* amtDescription = [entity.attributesByName objectForKey:@"amount"];
NSRelationshipDescription* nameDesc = [entity.relationshipsByName objectForKey:@"expenseCategory"];
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"amount"];
NSExpression *countExpression = [NSExpression expressionForFunction: @"sum:"
arguments: [NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName: @"Sum"];
[expressionDescription setExpression: countExpression];
[expressionDescription setExpressionResultType: NSDecimalAttributeType];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:amtDescription, expressionDescription, nameDesc, nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObject:nameDesc]];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];
[fetchRequest setSortDescriptors:sortDescriptors];
[context executeFetchRequest:fetchRequest error:&error];
Aber wenn ich laufen, ich habe Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attribute/relationship description names passed to setPropertiesToFetch: must match name on fetch entity
Jede mögliche Hilfe würde geschätzt.
- Ich bin immer noch vor dem gleichen problem .. ich brauche wirklich Eure Hilfe Jungs.
- Wenn Sie post einen screenshot vom Xcode-Modell-editor zeigt das Objektdiagramm, das wäre hilfreich. Klicken Sie auf "Stil Bearbeiten" am unteren Rand des Editors. Beispiel: techotopia.com/images/d/dc/Xcode_4.2_core_data_relationship.jpg
- Screenshot Hinzugefügt, in der Frage, bitte haben Sie einen Blick.
- setPropertiesToFetch kann nur property-Namen (strings) oder Eigenschaftsbeschreibungen, die gehören zu den Kosten. Sollte nicht die "Kosten" - Verhältnis von ExpenseCategory ein zu-viele-angesichts dessen, was Sie sind versuchen zu tun? Ich würde davon ausgehen, eine Kategorie kann viele (Kosten) Mitglieder, während die Kosten kann eine (oder mehr) Kategorien.
- Ja du hast Recht, eine Kategorie kann viele Kosten und Aufwand kann nur an einer Kategorie, eigentlich bin ich die Arbeit an einem vorhandenen Projekt-und core-Daten wurde von einigen anderen.Besser, wenn Sie könnten, posten Sie Ihre Antwort darunter, was falsch ist in core data und code.
- Habe meine Antwort für Sie arbeiten? Markieren Sie bitte meine Antwort als korrekt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist die Antwort auf Ihre Frage.
Wenn Sie wollen, filtern Sie nach Kosten addedTime und nicht die ExpenseCategory addedTime, dann ändern die das Prädikat:
Während der Beantwortung einer anderen Frage, die ich entdeckte die Ursache des betreffenden Fehlers markiert in dieser Frage ("Attribut/relationship Namen Beschreibung übergeben setPropertiesToFetch: muss-match-Namen, der auf der fetch-Einheit"). Ich bin das hinzufügen dieser Antwort zu helfen, diejenigen, die eine Lösung für diesen Fehler.
Den Grund für diesen Fehler ist, dass die fetchRequest ist
propertiesToFetch
gesetzt wird, BEVOR die fetchRequest istentity
. Ändern der Reihenfolge von dem code sollte das problem lösen:Den Apple-Dokumentation ist klar, dass die Attribute und Beziehungen enthalten, die in der
propertiesToFetch
muss mit einem Eigenschaft-name:Aber es dauerte eine lange Zeit, um zu realisieren, dass dieser test durchgeführt wird, sobald du
propertiesToFetch
(statt, wenn die fetch ausgeführt wird) daher die Notwendigkeit für dieentity
auf zuerst eingestellt werden.Übergeben Sie
|expressionDescription|
, die eineNSExpressionDescription
zusetPropertiesToFetch:
;setPropertiesToFetch:
akzeptiert ein array von NURNSPropertyDescriptions
, und so ist eine Ausnahme zu werfen.Beide
NSExpressionDescriptions
undNSPropertyDescriptions
dürfen insetPropertiesToGroupBy:
jedoch.Sollten Sie einen Blick auf pre-fetching Technik. In dieser url finden Sie ein Beispiel zwischen
Employee
undDepartment
.Hoffe, das hilft!