- 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?
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:
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.
Tags und Links nspredicate ios core-data