Coredata / SWIFT 获取有关系的记录

Posted

技术标签:

【中文标题】Coredata / SWIFT 获取有关系的记录【英文标题】:Coredata / SWIFT get records with relationship 【发布时间】:2016-03-26 10:31:17 【问题描述】:

核心数据关系仍然存在问题。

例子:

实体用户(idU,NameU = 属性) 实体设备(idD,NameD = 属性)

core data model 问题:当我创建一个链接到用户的新设备时,我遇到了 Nsset 问题。我认为这与多对多关系有关

还是不行更新:

代码:

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

错误: 创造器登场

创建设备/trace currentUserName = toto

创建设备/trace existingUser[0].userName = Optional("toto")

创建设备firstUserFound =(实体:用户;id:0xd000000000080000;数据: 设备=“”; 用户 ID = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; 用户名 = toto; )

前卫的关系

2016-04-02 13:55:13.065 testcoredatarelationships[1568:370426] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“对多关系不可接受的值类型:属性 =“用户";所需类型 = NSSet;给定类型 = testcoredatarelationships.User;值=(实体:用户;ID:0xd000000000080000;数据: 设备=“”; 用户 ID = "8A32EAC6-87E2-4CF1-8265-5E7A32ABCEBB"; 用户名 = toto; )。 * 首先抛出调用栈:

错误的行: newDevice.setValue(firstUserFound, forKey: "users")

扩展设备

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

【问题讨论】:

您是否已经拥有 Jack 实例?你的关系是双向的(应该是双向的)吗?显示实体模型的图片。 嗨 Wain,事实上,现在它只是虚拟数据。我放了核心模型(有些字段不一样但应该没问题) 我想创建一个真实的例子来了解实体之间的关系是如何工作的。所以我用这个简单的核心数据创建了一个简单的视图,但我无法实现它(需要帮助才能完成) 【参考方案1】:

您使用的是多对多关系,因此获取千斤顶设备的最简单方法是获取千斤顶(带有获取请求),然后向其询问其设备。这可以导航关系,因此您不需要再次获取。

可以直接获取与具有特定名称的用户有关系的设备,但这样做更复杂。

【讨论】:

用户和设备是 n 对 n 关系 / 设备和卡应该是 1 对 n (1 台设备有几张卡,但每张卡专用于一个设备 = 例如参考) 关于您的 2 个答案:您将如何做到这一点?因为用户没有设备属性?关于第二种情况,您如何直接使用设备获取 Caen ?你有这两种可能性的例子吗? 如果你有一个用户实例,jack 那么它只是jack.devices 为什么说:可以直接获取与具有特定名称的用户有关系的设备,但这样做更复杂。有什么例子吗? 因为您可以执行 fetch 请求,但它是最复杂的谓词类型之一。希望像 ANY user.name == %@ 这样的谓词对你有用

以上是关于Coredata / SWIFT 获取有关系的记录的主要内容,如果未能解决你的问题,请参考以下文章

在Doctrine中插入有关系的记录后获取ID

iOS swift:使用 coredata (cloudkit) 存储缓存

如何使用 Swift 从 CoreData sqlite 表中获取特定的行数据

Swift 3.1 Coredata 按字母升序排序,但保留以数字开头的记录

无法在 CoreData swift 中保存数据

获取与 NSFetchedResultsController 有关系的对象