2016-03-26 2 views
1

По-прежнему возникают проблемы с основными отношениями данных.Coredata/SWIFT получить записи с отношениями

Пример:

Entity пользователя (IDU, NameU = атрибуты) Entity Device (IDD, Названный = атрибуты)

core data model Вопрос: У меня есть вопрос NSSet когда я создать новое устройство связанных с пользователем. я думаю, что это связанно с многими-многими

до сих пор не работает UPDATE:

код:

@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") 

Ошибка: дебюта устройство Создания

Устройство для создания/отслеживание тока UserName = Toto

устройство Создание/трассировки existingUser [0] = .userName Необязательный ("тотализатор")

Устройство создания firstUserFound = (сущность: Пользователь; id: 0xd000000000080000; данные: { devices = ""; userId = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; userName = toto; })

авангард relationhips

2016-04-02 13: 55: 13.065 testcoredatarelationships [1568: 370426] * Согласующий приложение из-за неперехваченного исключением 'NSInvalidArgumentException', причина: «Недопустимый тип значения для к -many relationship: property = "users"; желаемый тип = NSSet; данный тип = testcoredatarelationships.User; value = (entity: User; id: 0xd000000000080000; данные: { devices = ""; userId = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; userName = toto; }). * Первый стек бросить вызов:

линия, которая не так: newDevice.setValue (firstUserFound, forKey: "пользователи")

расширение устройства {

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

}

+0

У вас уже есть экземпляр Jack? Являются ли ваши отношения двунаправленными (они должны быть)? Показать изображение модели объекта. – Wain

+0

привет Уэйн, на самом деле, пока это просто фиктивные данные.Я поместил основную модель (некоторые поля разные, но это должно быть нормально) – h3630fr

+0

Я хотел бы создать реальный пример, чтобы понять, как работают отношения между сущностями. поэтому я создал простой вид с этими простыми базовыми данными, но я не могу его достичь (нужна помощь для завершения). – h3630fr

ответ

1

You «используя много-много отношений, поэтому самый простой способ получить устройства с разъемами - получить разъем (с запросом на выборку), а затем запросить его для своих устройств. Это перемещает отношения, поэтому вам не нужна другая выборка.

Можно напрямую выбрать устройства, которые имеют отношение к пользователю с определенным именем, но это сложнее сделать.

+0

Пользователь и устройство - это отношение/устройство и карта должны быть от 1 до n (несколько карт для 1 устройства, но каждая карта посвящен одному устройству = ссылка, например) – h3630fr

+0

О ваших двух ответах: как вы это сделаете? Потому что у пользователя нет атрибутов устройств? О втором случае, как Кан вы напрямую забираете устройство? У вас есть пример обеих возможностей? – h3630fr

+0

Если у вас есть пользовательский экземпляр 'jack', то это просто' jack.devices' – Wain