1

Ich habe eine Eins-zu-viele-Beziehung zwischen zwei Kerndateneinheiten.CoreData Relationship Validation Fehlerbehandlung

als unten A - >> B

A - >> B: Löschen Deny (dh das Löschen eines Deny während ihre Objekte von B)

B -> A: werden aufgehoben

In einem Kontext sind einem Kontext andere Änderungen nicht bekannt. In diesem Fall erhalte ich einen Validierungsfehler beim Speichern des übergeordneten Kontexts, weil in einem Kontext ein Kind in ein Elternelement eingefügt wird, das in einem anderen Kontext gelöscht wird.

Es gibt nur wenige oder gar keine Informationen darüber, wie Validierungsfehler zu behandeln sind. Die meisten Beispiele zeigen nur Fehler für den Benutzer und verwerfen die Änderungen. Wenn ich das Löschen des bestimmten Elternobjekts rückgängig machen muss, kann ich das tun?

Gibt es eine Option, wie ich den Validierungsfehler behandeln kann. NSValidationRelationshipDeniedDeleteError

+0

können Sie immer noch verfolgen, was in anderen Kontexten mit 'mergeChangesFromContextDidSaveNotification' vor sich geht –

Antwort

0

Ich habe keinen Weg gefunden, das Löschen nur für ein bestimmtes Objekt rückgängig zu machen, ohne Änderungen zu verlieren. Wenn Sie also eine übergeordnete Entität in einer childContext gelöscht und dann die childContext gespeichert haben, wird die gelöschte Entität automatisch zu parentContext.deletedObjects hinzugefügt. Ich versuchte verschiedene Ansätze, aber die einzige Möglichkeit, den Löschvorgang von der parentContext abzubrechen, ist parentContext.refreshObject(deletedParent, mergeChanges: false) anrufen. (Sicher können Sie versuchen, den Kontext wiederherzustellen oder zurückzusetzen)

Es hängt wirklich davon ab, was Sie tun werden (so hat das Geschäft einen großen Einfluss hier!). Aber ich denke, Sie sollten optimistisch arbeiten: https://en.wikipedia.org/wiki/Optimistic_concurrency_control Manchmal, im Falle von Konflikten, ist es in Ordnung, die Transaktionen zurückzusetzen und neu zu starten.

Normalerweise überschreibt die childContext die Änderungen der parentContext (das Kind hat höhere Priorität). Also sollte die Architektur deiner App genauso funktionieren. Wenn Sie eine Entität in der childContext löschen, sollten Sie sie auch in der parentContext löschen, auch wenn die Deny-Regel Sie stoppt, weil Sie eine neue untergeordnete Entität eingefügt haben. Was Sie tun sollten, sollten Sie die eingefügten Entitäten entfernen und dann die übergeordnete Entität löschen. Ansonsten solltest du die Architektur der App neu gestalten.