2016-03-26 12 views
1

Noch in Schwierigkeiten mit Kerndaten Beziehungen.Coredata/SWIFT erhalten Datensätze mit Beziehung

Beispiel:

Entity Benutzer (IDU NameU = Attribute) Entity-Gerät (IDD, Named = Attribute)

core data model Frage: Ich habe ein nsset Problem, wenn ich ein neues Gerät erstellen mit dem Benutzer verknüpft Ich denke, es zu den vielen n-Beziehungen verwandt ist

immer noch nicht funktioniert UPDATE:

Code:

@IBAction func addDeviceBoutonAction(sender: AnyObject) { 

     print("Creation Device debut") 
     var nbCharacteres = Int((newDeviceNameTextField.text?.characters.count)!) 
     if currentUserName == "" { 
      print("Erreur creation device/currentUserName = Vide --> Abort") 
      } 
      else if nbCharacteres == 0 { 
      print("Erreur creation device/newDeviceNameTextField = Vide --> Abort") 
      } 
      else 
      { 
      // init du MOC 
      let MOC = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 
     // creation de la requete sur l'entité User avec un predicat : on recupere que les infos du user selectionné dans le pickerViewUser (on 
     // travaille avec la variable globale currentUserName qui a été initialisée lors du didSelectRow du pickerViewUser) 
     let fetchRequestUser = NSFetchRequest(entityName: "User") 
     print("Creation device/trace currentUserName = \(currentUserName)") 
     let userPredicate = NSPredicate(format: "userName == %@", currentUserName) 
     // On colle le predicat dans la requete 
     fetchRequestUser.predicate = userPredicate 

     var requestError: NSError? 
     let existingUser = (try! MOC.executeFetchRequest(fetchRequestUser)) as! [User] 
     print("Creation device/trace existingUser[0].userName = \(existingUser[0].userName)") 
     // il faut passer par l'ID plutot que le nom 
     // firstUserFound de type User 
     let firstUserFound = existingUser[0] 
       print("Creation device firstUserFound = \(firstUserFound)")  

     // Insertion d'un nouveau Device dans la base (relationship n to n entre Device et User) 
     let existingDevicesForThisUser = firstUserFound.mutableSetValueForKey("device") 

     // Create Item Record 
     let newDevice = NSEntityDescription.insertNewObjectForEntityForName("Device",inManagedObjectContext: MOC) as! Device 
     //if let newDevice = createRecordForEntity("Device", inManagedObjectContext: MOC) { 
     // Set Attributes and values 
     newDevice.setValue(NSUUID().UUIDString, forKey: "deviceId") 
     newDevice.setValue(newDeviceNameTextField.text, forKey: "deviceName") 
     newDeviceNameTextField.text = "" 
     self.view.endEditing(true) 
     //newDevice.setValue("Device \(newDevice.count + 1)", forKey: "deviceId") 
     // Set Relationship 
     print("avant relationhips") 
     newDevice.setValue(firstUserFound, forKey: "users") 

Fehler: Erstellungseinheit Debüt

Creation device/trace current Username = toto

Creation Gerät/trace existingUser [0] .userName = Optional ("toto")

Creation Gerät firstUserFound = (Einheit: Benutzer; ID: 0xd000000000080000; Daten: { Geräte = ""; userId = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; Benutzername = Toto; })

avant relationhips

2016.04.02 13: 55: 13.065 testcoredatarelationships [1568: 370.426] * Beenden app aufgrund abgefangene Ausnahme 'NSInvalidArgumentException', Grund: ‚Unacceptable Art von Wert zu -viele Beziehung: Eigenschaft = "Benutzer"; gewünschter Typ = NSSet; gegebener Typ = testcoredatarerelationships.User; Wert = (Entität: Benutzer; ID: 0xd000000000080000; Daten: { Geräte = ""; userId = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; userName = toto; }). ' * ersten Wurf Call-Stack:

Linie, die falsch ist: newDevice.setValue (firstUserFound, forKey: "Benutzer")

Erweiterung Geräte {

@NSManaged var deviceId: String? 
@NSManaged var deviceName: String? 
@NSManaged var cards: NSSet? 
**@NSManaged var users: NSSet?** 

}

+0

Haben Sie die Jack-Instanz bereits? Sind Ihre Beziehungen bidirektional (sollten sie sein)? Zeigen Sie ein Bild des Entitätsmodells. – Wain

+0

hallo Wain, eigentlich sind es nur Dummy-Daten.Ich stelle das Kernmodell (einige Felder sind unterschiedlich, aber es sollte in Ordnung sein) – h3630fr

+0

Ich möchte ein echtes Beispiel erstellen, nur um zu verstehen, wie Beziehungen zwischen Entitäten funktioniert. also habe ich eine einfache Ansicht mit diesen einfachen Kerndaten erstellt, aber ich kann es nicht erreichen (brauche Hilfe zu beenden) – h3630fr

Antwort

1

Sie Verwenden Sie eine Viele-zu-Viele-Beziehung, also ist der einfachste Weg, Jacks Geräte zu bekommen, Jack (mit einer Fetch-Anfrage) zu bekommen und dann nach seinen Geräten zu fragen. Dadurch wird die Beziehung navigiert, sodass Sie keinen weiteren Abruf benötigen.

Es ist möglich, Geräte direkt abzurufen, die eine Beziehung zu einem Benutzer mit einem bestimmten Namen haben, aber das ist komplizierter.

+0

Benutzer und Gerät ist eine zu n Beziehung/Gerät und Karte sollte 1 bis n sein (mehrere Karten für 1 Gerät, aber jede Karte ist für ein Gerät = Referenz zum Beispiel) – h3630fr

+0

Über Ihre 2 Antworten: Wie werden Sie das tun? Weil Benutzer keine Geräteattribute haben? Über den zweiten Fall, wie Caen Sie direkt mit Gerät holen? Hast du ein Beispiel für beide Möglichkeiten? – h3630fr

+0

Wenn Sie eine Benutzerinstanz haben, 'jack', dann ist es nur' jack.devices' – Wain

Verwandte Themen