Kerndaten: Was soll ich als Sortierdeskriptor mit geordneter Menge (ios5) in einer Viele-zu-viele-Beziehung verwenden?

8

- Ich habe eine Item Entität und eine Tag Entität. - Elemente können mehrere Tags haben und Tags können mit mehreren Elementen verknüpft werden (Viele-zu-viele-Beziehung). - Die Beziehung ist eine "geordnete Beziehung" (mit geordneter Beziehung in IOS5) in beide Richtungen.

Ich möchte alle untergeordneten Tags für ein bestimmtes Element abrufen

Ich verwende die folgende Abrufanforderung:

%Vor%

Der obige Sortierungsdeskriptor gibt Daten zurück (von denen ich annahm, dass sie in einer bestimmten Reihenfolge sind), stürzt dann aber ab:

%Vor%

Wenn ich ein leeres Sortierdeskriptor-Array gebe, bekomme ich keinen Absturz, aber das Ergebnis ist nicht geordnet.

Wie kann ich den Sortierungsdeskriptor in einer Viele-zu-Viele-Beziehung richtig implementieren, indem ich die Funktion der geordneten Beziehung in ios5 verwende?

    
Ash 06.09.2012, 16:32
quelle

1 Antwort

15

Ich denke, Sie könnten falsch verstehen, was eine geordnete Beziehung in Core Data bedeutet. Nach diese Frage , " geordert "bedeutet nicht" in Bezug auf eine Eigenschaft "- stattdessen bedeutet" bestellt "" behält die Bestellung des Benutzers "(oder eine andere bestimmte Reihenfolge, die sonst willkürlich scheinen würde). Einige Beispiele:

  • Eine geordnete Beziehung wäre gut für Schritte in einem Rezept (das Beispiel aus Apples Kerndaten Release Notes ) - die Schritte konnten nicht unbedingt in Bezug auf eine ihrer Eigenschaften (zB deren Text) angeordnet werden, und hätten um eine "Index" - oder "Order" -Eigenschaft selbständig zu verwalten, wenn Core Data die Bestellung nicht durchgeführt hat.
  • Eine geordnete Beziehung würde nicht für eine Liste von Namen gut sein - der Benutzer könnte zum Beispiel nach Vor- oder Nachnamen sortieren, und die Sammlung von Namen hat intern keine echte innere Reihenfolge. Das einzige, was zählt, ist die Anzeigereihenfolge - die Daten selbst müssen diese Reihenfolge nicht beibehalten. (Die Faustregel in Apples Dokumenten besteht darin, dass, wenn ein Benutzer möglicherweise zwischen Sortierspezifizierern wählen könnte, die Beziehung nicht in Core Data angeordnet werden sollte.)

In Ihrem Fall versuchen Sie, einen Sortierdeskriptor auf den Satz geordneter Mengen (die Werte für die Eigenschaft tags ) anzuwenden, den Sie abrufen. Dies ist die Ursache für Ihren Absturz - die Unterklasse NSOrderedSet ( _NSFaultingMutableOrderedSet , in Ihrem Fall) implementiert nicht die -compare: -Methode, die der Sortierungsdeskriptor verwenden würde, um sie zu sortieren, und so erhalten Sie diese Ausnahme.

Ich denke, eine gute Lösung für Sie wäre es, keinen Sortierdeskriptor zu verwenden; Wenn Sie stattdessen die beibehaltene Reihenfolge für die Anzeige für den Benutzer ändern möchten, rufen Sie den NSOrderedSet-Wert für tags für ein Element ab und rufen Sie dann ein Array mit Ihrer eigenen Sortierung mithilfe von -sortedArrayUsingComparator: . Dadurch werden die Daten in Core Data in der richtigen Reihenfolge gespeichert, Sie können sie jedoch selbst programmgesteuert neu anordnen.

Auf einer höheren Ebene sollten Sie auch überlegen, ob Sie in Ihren Beziehungen wirklich Ordnung brauchen oder nicht. Es verursacht eine erhebliche Leistungseinbuße, und alles, was Sie wirklich zurückbekommen, ist die ursprüngliche Reihenfolge, in der den Elementen Markierungen hinzugefügt wurden (oder umgekehrt). Wenn Sie diese Reihenfolge jedes Mal ändern möchten, wenn Sie die Tags anzeigen, nehmen Sie diesen Performance-Treffer für keinen wirklichen Vorteil - machen Sie Ihre Beziehungen ungeordnet, und setzen Sie entweder die Sortierung programmgesteuert fort oder verwenden Sie einen Sortierungsdeskriptor für einen Aggregatschlüssel wie%. co_de%, wie in den Kommentaren vorgeschlagen.

    
Tim 11.09.2012, 16:27
quelle

Tags und Links