2016-06-25 17 views
0

Ich habe eine Viele-zu-viele-Beziehung zwischen zwei Entitäten; A und B.NSFetchRequest to-many key ist hier nicht erlaubt

Ich möchte eine Reihe von B.relationship für jeden A zurückzukehren, wo B.relationship ‚s Zahl größer als 0 ist und sortiert nach B‚s dateCreated Eigenschaft.

Dies ist der Code, den ich derzeit habe, der wahrscheinlich ein wenig mehr Sinn macht.

let fetchRecentVariationsRequest = NSFetchRequest(entityName: "Variation") 
fetchRecentVariationsRequest.predicate = NSPredicate(format: "ANY [email protected] > 0") 
fetchRecentVariationsRequest.sortDescriptors = [NSSortDescriptor(key: "activities.dateCreated", ascending: true)] 

Wenn ich laufen die Anfrage ich die folgende Ausnahme erhalten:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here’

Ich verstehe, warum ich den Fehler bin immer aber, wie ich sortiere nach eine zu viele Eigenschaft für eine Art Descriptor in Kerndatei?

bearbeiten

mehr klar zu sein, wie ich würde die 6 letzten Activity Einheiten durch ihre dateCreated Eigenschaft sortiert holen (neueste zuerst).

Dann würde Ich mag alle der Variation Einheiten holen, die an diese geholt Activity Einheiten über die variations Beziehung Activity des Unternehmens verbunden sind.

+0

Danke für das Update. Ein paar Fragen: Angenommen, die erste Aktivität hat drei Variationen - in welcher Reihenfolge sollen diese sortiert werden? Und wenn eine Variation mit der ersten Aktivität und der fünften Aktivität zusammenhängt, sollte sie zweimal in den Endergebnissen erscheinen? – pbasdf

+0

Kein Problem. 1) Sortiert nach der Eigenschaft 'name' in' Variation'. 2) Das sollte in meinem Modell nicht möglich sein –

Antwort

0

Sie können nicht nach dem Attribut einer Zu-Viele-Beziehung sortieren, da dies keinen Sinn ergibt. CoreData muss entscheiden, welche Variante zuerst eingefügt werden soll. Ihr Sortierungsdeskriptor sagt "Verwenden Sie den Wert von dateCreated für die verwandten Aktivitäten". Aber es gibt mehrere Aktivitäten und somit mehrere dateCreated-Werte für jede Variation. Welchen Aktivitäten 'dateCreated' sollte er verwenden? Das Letzte? Der Erste? Der Durchschnitt?

Aber zusätzlich zu diesem konzeptuellen Problem, CoreData wird Ihnen nur erlauben, ein Attribut oder eine to-one-Beziehung zu verwenden, um nach (zumindest für einen Abruf aus dem SQLite-Speicher) zu sortieren. Keine vorübergehenden Eigenschaften; keine berechneten Eigenschaften Wenn Sie also das dateCreated der letzten verwandten Aktivität verwenden möchten, müssen Sie der Variation ein Attribut hinzufügen, das Sie jedes Mal aktualisieren, wenn eine Aktivität der Beziehung hinzugefügt wird.

fetchRecentActivitiesRequest = NSFetchRequest(entityName: "Activity") 
fetchRecentActivitiesRequest.sortDescriptors = [NSSortDescriptor(key: "dateCreated", ascending: false)] 
fetchRecentActivitiesRequest.fetchLimit = 6 
// I recommend using the next line to fetch the related Variations in one go 
fetchRecentActivitiesRequest.relationshipKeyPathsForPrefetching = ["variations"] 
let recentActivities = try! context.executeFetchRequest(fetchRecentActivitiesRequest) as! [Activity] 

und verwenden Sie dann die variations Beziehung den entsprechenden Variations zu erhalten:

EDIT

Ihr Update gegeben, würde ich die letzten sechs Aktivitäten zuerst holen

let nameSort = NSSortDescriptor(key: "name", ascending: true) 
let recentVariations = recentActivities.flatMap() { 
    $0.variations!.sortedArrayUsingDescriptors([nameSort]) 
} 
+0

Also welche Art von 'NSfetchRequest' soll ich verwenden? –

+0

@AdamCarter Können Sie Ihren Beitrag bearbeiten, um detaillierter zu erklären, wie Sie die Dinge sortiert haben möchten - vielleicht mit einigen Beispielen? – pbasdf

+0

Nur aktualisiert meine Frage, um ein wenig klarer zu sein :) –