2016-06-16 10 views
1

Ich verwende derzeit Kerndaten in meiner Anwendung. Ich habe die folgenden Entitäten: Benachrichtigung (zu-1), Personen (zu-viele). Die Einheiten sind wie folgt:Der Vorgang konnte nicht abgeschlossen werden. (Kakao Fehler 133021.) + swift 2

schema for Notification entity

schema for People entity

Die Menschen Einheit hat eine eindeutige Einschränkung, die das Feld-ID ist. Grundsätzlich werde ich Benachrichtigungen (die in der Notification-Entität gespeichert werden) von Personen erhalten (die in People-Entität gespeichert werden). Ich möchte die Entität Personen aktualisieren, wenn eine Person mit einer bestimmten ID mehr als eine Benachrichtigung sendet und keine neue Person erstellt (die doppelt vorhanden ist).

Wenn ich das tue, oben ich die folgende Fehlermeldung erhalten:

Der Vorgang konnte nicht abgeschlossen werden. (Kakao Fehler 133021.)

Kann mir bitte jemand helfen, dieses Problem zu lösen. Unten finden Sie meinen Code und ein Beispiel für die Daten, die ich speichern möchte.

let entityNotification = NSEntityDescription.entityForName("Notification", inManagedObjectContext: self.managedContext) 

    let newNotification = Notification(entity: entityNotification!, insertIntoManagedObjectContext: self.managedContext) 

    newNotification.message = data["message"] as? String 

    if let actor = data["actor"] as? [String : AnyObject] 
    { 
     let newPeople = NSEntityDescription.insertNewObjectForEntityForName("People", inManagedObjectContext: self.managedContext) as! People 

     newPeople.id = actor["id"] as? Int 
     newPeople.name = actor["name"] as? String 

     newNotification.actor = newPeople 
    } 

    if let designator = data["designator"] as? [String : AnyObject] 
    { 
     let newPeople = NSEntityDescription.insertNewObjectForEntityForName("People", inManagedObjectContext: self.managedContext) as! People 

     newPeople.id = designator["id"] as? Int 
     newPeople.name = designator["name"] as? String 

     newNotification.designator = newPeople 
    } 

    do 
    { 
     try newNotification.managedObjectContext?.save() 
    } 
    catch let error as NSError 
    { 
     print(error.localizedDescription) 
    } 

Datenmodell:

let notif = ["message" : "testing", 
       "actor" : ["id": 1, "name": "jim"], 
       "designator" : ["id": 2, "name": "dave"]] 

    let notif1 = ["message" : "testing 1", 
       "actor" : ["id": 1, "name": "jim21"], 
       "designator" : ["id": 2, "name": "dave"]] 
+0

Nirgendwo in Ihrem Code zu tun versuchen Sie einen vorhandenen g 'People' Instanz – Paulw11

+0

Coredata zu laden Tutorial in Swift: https://iosdevcenters.blogspot.com/2016/06/crud-operations-susing-code-data-swift.html –

Antwort

4

Der traditionelle Weg, das Problem der doppelten Schöpfung zu lösen, ist eine Anforderung mit dieser Identität für eine Person holen zu tun, und statt der Schaffung neuer aktualisieren. Dies kann auch die beste Option für Sie sein, Tests werden es zeigen.

Mit einzigartigen Einschränkungen können Kerndaten eine Zusammenführung für Sie tun, aber Sie müssen es wie sagen. Momentan verschmelzen sie, indem sie einen Fehler werfen, der nicht so nützlich ist. Sie müssen die mergePolicy auf den Kontext NSMergeByPropertyObjectTrumpMergePolicy setzen und es dann, wenn das Ergebnis zu sehen versuchen, ist wirklich das, was Sie wollen ...

+0

es hat funktioniert .. vielen Dank – iMobileBand