2015-06-17 4 views
9

In der WWDC15-Videositzung, 'What's New in Core Data' um 10:45 Minuten (in der Präsentation) beschreibt der Apple-Ingenieur eine neue Funktion des Modell-Builders, die ermöglicht Sie können eindeutige Eigenschaften angeben. Sobald Sie diese eindeutigen Eigenschaften festgelegt haben, erstellt Core Data kein doppeltes Objekt mit dieser Eigenschaft. Dadurch müssen Sie nicht mehr überprüfen, ob ein identisches Objekt vor dem Erstellen eines neuen Objekts vorhanden ist.Wie implementiert man die neue Core Data Model Builder Eigenschaft in iOS 9.0 Beta

Ich habe damit experimentiert, habe aber kein Glück, die Erstellung neuer Objekte mit identischen 'einzigartigen' Eigenschaften (doppelte Objekte) zu verhindern. Abgesehen von der 5-minütigen Videoerklärung habe ich keine weiteren Informationen zur Verwendung dieser Funktion gefunden.

enter image description here

Hat jemand Erfahrung, um die ‚einzigartige‘ Eigenschaft Attribut im Kerndatenmodell zu implementieren?

+1

Ich kann das auch nicht funktionieren. Die "Unique" -Eigenschaft in den Entity-Einstellungen wurde in 'Constraints' umbenannt. –

+1

Ich habe gerade einen [Blog-Beitrag dazu] geschrieben (http://dorianroy.com/blog/2015/09/how-to-implement-unique -constraints-in-core-data-with-ios-9 /) –

Antwort

-1

Ich weiß nicht die richtige Antwort, da dies eine Beta-Version ist, aber nach einer Minute mit ihm spielt ich einen Weg gefunden, damit es funktioniert:

  1. das Modell mitteilen, welche Form Attribute die einzigartige Einschränkung, genau wie in dem Bild, das Sie in Ihrer Frage haben.

  2. einen neuen Datensatz hinzufügen:

let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag
  1. die Werte auf die attribues zuordnen.

  2. Speichern Sie Ihre Änderungen:

do { 
    try context.save() 
} catch let error as NSError { 
    print("Error: \(error.localizedDescription)") 
    context.reset() 
}

Der Schlüssel ist in der catch Block. Wenn ein Fehler auftritt, setzen Sie den Kontext in den vorherigen Zustand zurück. Da die Sicherungsoperation fehlgeschlagen ist, sind die doppelten Datensätze nicht vorhanden.

Bitte beachten Sie, dass Sie den Fehler überprüfen sollten, um zu sehen, ob es durch einen doppelten Datensatz verursacht wurde.

Ich hoffe, das hilft.

11

Kurze Antwort: Sie finden diese Zeile in die Core Data Stack Setup-Code hinzufügen müssen:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

Lange Antwort: ich mit dieser für einige Zeit zu kämpfen, aber ich denke, ich habe es jetzt herausgefunden:

Unique Constraints (UC) verhindern nicht das Erstellen von Duplikaten in einem Kontext. Nur wenn Sie versuchen, diesen Kontext zu speichern, überprüft Core Data die Eindeutigkeit der UCs.

Wenn mehr als ein Objekt mit demselben Wert für eine UC gefunden wird, wird standardmäßig ein Fehler ausgegeben, da die Standardrichtlinie für die Zusammenführung von Konflikten NSErrorMergePolicyType ist. Der Fehler enthält die widersprüchlichen Objekte in seinem userInfo.conflictList, so dass Sie den Konflikt manuell beheben konnten.

Aber die meiste Zeit möchten Sie wahrscheinlich einen der anderen merge policies stattdessen verwenden und Kerndaten die Konflikte automatisch zusammenführen lassen. Diese Zusammenführungsrichtlinien waren zuvor bereits vorhanden und werden für Konflikte zwischen Objekten in verschiedenen Kontexten verwendet. Vielleicht wurden sie deshalb im Zusammenhang mit dem UC-Feature auf der WWDC-Session 220 nicht erwähnt. Normalerweise ist die richtige Wahl NSMergeByPropertyObjectTrumpMergePolicy. Im Grunde heißt es: "Neue Daten übertrumpfen alte Daten". Dies ist das, was Sie im allgemeinen Szenario wollen, wenn Sie neue Daten aus externen Quellen importieren.

(Tipp: Zuerst hatte ich Probleme, dieses Verhalten zu überprüfen, weil die doppelten Objekte im Kontext zu bleiben scheinen, bis der Speichervorgang beendet ist - was in meinem Fall asynchron in einer Hintergrundwarteschlange passiert ist Objekte direkt nach dem Drücken der Speichern-Taste, können Sie immer noch die Duplikate sehen.)

+0

Danke für die ausführliche Antwort und den Blogpost :). Ich habe festgestellt, dass "PropertyObjectTrumpMergePolicyType" die Beziehung zu anderen Entitäten unterbricht (im Gegensatz zu dem, was Sie im Blogpost erwähnt haben). Verfügen Sie über ein Schlüssel- oder Codebeispiel, das beweist, dass Beziehungen mit dieser Zusammenführungsrichtlinie nicht berührt werden? –

+0

Jemand erwähnte das auf Twitter vor ein paar Tagen. Vielleicht gab es eine Änderung in den letzten Betriebssystemversionen. Ich habe diese Funktion seit damals nicht benutzt. Aber ich vermute, dass das Verhalten von der Löschregel der Beziehung abhängen könnte. Ich würde vorschlagen, dass Sie Ihre Erfahrungen in den Kommentaren des Blogs melden oder eine neue Frage hier öffnen. –