Sie denken an Core Data als SQL. Ein großer Fehler.
Entitäten sind keine Tabellen und Instanzen sind keine Datensätze. Jede Instanz ist ein eigenes Objekt, so dass Sie sie einzeln ändern müssen. Andernfalls hätte die Verwendung eines Objektgraphen keinen Sinn.
Bearbeiten01:
Wie würde dann Sie das folgende UI-Problem behandeln: Sie möchten eine Tabelle mit Personen Entitäten, geordnet nach "Name". ABER ... der Benutzer kann die angezeigten Personen Entitäten in dieser Tabelle neu anordnen UND Sie wollen, dass das persistiert wird, so dass die Entitäten jetzt nach "Name" sortiert sind + "displayOrder" (oder was immer Sie wollen nennen wollen). Wo pflegen Sie den Wert von "displayOrder", wenn nicht als Attribut der Entität Person?
Oh, ich verstehe, was du versuchst zu tun. Sie machen es viel schwieriger, als es sein muss. Core Data handhabt diese Art von Funktion problemlos.
Sortierreihenfolgen sind nicht (normalerweise, siehe unten ) Facetten des Datenmodells, sondern der View-Controller, d.h. es handelt sich lediglich um temporäre Aufträge, die dazu dienen, dem Benutzer Daten in sinnvoller Weise anzuzeigen. Als solche werden sie je nach Bedarf spontan erstellt. In diesem Fall würden Sie einen NSSortDescriptor/s erstellen, um nach den gewünschten Attributschlüsseln zu sortieren. Dann stellen Sie Ihre Fetch-Anfrage so ein, dass diese Sortierdeskriptoren verwendet werden. Dann würde Ihr Fetch ein Array mit den Elementen in der gewünschten Reihenfolge zurückgeben.
Kein Aufwand, kein Durcheinander.
Wenn der Benutzer eine andere Sortierreihenfolge wünscht, muss er nur eine andere Gruppe von Sortierbeschreibungen erstellen. Es gibt keinen Grund, die Sortierlogik in das eigentliche Datenmodell aufzunehmen, und es gibt viele Gründe, dies nicht zu tun.
Die Trennung der eigentlichen Daten von der Anzeige ist im Model-View-Controller-Entwurfsmuster, auf dem die gesamte iPhone-API basiert, sehr wichtig. Sie wollen keine Anzeigelogik in das Datenmodell einbinden und Sie wollen keine Daten speichern oder eine Datenverarbeitungslogik in der Anzeige haben.
Bearbeiten02:
In meinem Fall müssen die Benutzer in der Lage sein in die Anwendung zurückkehren, die Tabelle die Tabelle und die Entitäten der Person in der Reihenfolge zu sehen, in der THEY sie angelegt hat. Wie sonst können Sie dies tun, außer mit einem displayOrder-Attribut?
Wenn Sie den Auftrag als Benutzerdaten speichern wollen, müssen Sie ihn in das Datenmodell aufnehmen.
Zufälligerweise hatte ich gerade ein solches Bedürfnis. So habe ich das Problem für eine kleine Anzahl von Objekten gelöst. Dies sind die Methoden der Unterklasse NSMangedObject. Dies funktioniert für mehrere hundert leichtgewichtige Objekte.
Wenn Sie eine große Anzahl von schweren Objekten (Tausende) haben, schlage ich vor, eine leichtgewichtige Entität zu erstellen, um eine verknüpfte Liste zu implementieren. Nennen Sie es OrderEntity. Es hätte ein Index-Attribut, eine Beziehung zu der indizierten Entität, eine Beziehung zur vorherigen OrderEntity und eine Beziehung zur nächsten. (Die Verwendung einer leichtgewichtigen Entität verhindert, dass Sie schwere Objekte fehlerhaft machen müssen, was Speicher spart und alles schneller macht. Sie müssen das indizierte Objekt nur dann abfragen, wenn Sie es anzeigen müssen).
Dann verwenden Sie die Standardmethoden für verknüpfte Listen, um die Elemente in der Liste einzufügen, zu tauschen und zu verschieben. Dann rufen Sie update für die verschobenen Objekte auf und diese rufen alle nachfolgenden OrderEntities auf, um ihre Indizes zu aktualisieren.
Es kann so einfach sein wie eine Methode, die die nächste OrderEntity aufruft, den Index des aktuellen Objekts übergibt und die nächste OrderEntity anweist, ihre Reihenfolge auf passedIndex+1 zu setzen. Das ist im Grunde genau die Funktion der SQL-Anweisung, die Sie nachahmen wollen (denn die Logik ist natürlich dieselbe).
Wenn Sie dies häufig tun müssen, erstellen Sie eine NSManagedObject-Unterklasse, um die Indizierung zu handhaben, und lassen Sie dann Ihre indizierten Klassen davon erben.