Swift 2:使用一对多条件保存 coredata

Posted

技术标签:

【中文标题】Swift 2:使用一对多条件保存 coredata【英文标题】:Swift 2: Save coredata with one-to-many conditions 【发布时间】:2015-10-29 08:13:27 【问题描述】:

我想用 swift 2 绑定我的 2 个模型:

“身体部位”表:

“肌肉”表:

我只想保存一个带有“肌肉”的“身体部位”:

  if let managedObjectContext = self.managedObjectContext 

                do

                    // create a bodyPart
                     let bodyPart = NSEntityDescription.insertNewObjectForEntityForName("BodyPart",inManagedObjectContext: managedObjectContext) as! BodyPart

                    // create a Muscle
                    let muscle = NSEntityDescription.insertNewObjectForEntityForName("Muscle",inManagedObjectContext: managedObjectContext) as! Muscle


                    //muscles attributes
                    muscle.name = "test"
                    muscle.image = "myimage.png"

                    // mobdypart attributes
                    bodyPart.name="mybody-part test"
                    bodyPart.muscles = [muscle]

                    //save
                    try managedObjectContext.save()


                    // get all muscles
                    let fetchRequest = NSFetchRequest(entityName: "BodyPart")

                    /* Get result array from ManagedObjectContext */
                    let fetchResults = try managedObjectContext.executeFetchRequest(fetchRequest)

                    // list body parts
                    if let results: Array = fetchResults 
                        for obj:AnyObject in results 

                            let name:String? = obj.valueForKey("name") as? String
                            print("name for the BodyPart: \(name) ")

                            // list muscles => always empty !!
                            if let muscles: Array<Muscle> = obj.valueForKey("muscles") as? Array<Muscle> 
                                for ob:Muscle in muscles 
                                    print("### name for the muscles: \(ob.name)")
                                
                            

                        

                     else 
                        print("Could not fetch")
                    


                 catch let error as NSError  
                    print(error)
                
            

BodyPart 保存在 CodeData 中,但 Muscles 列表为空。 谢谢

【问题讨论】:

【参考方案1】:

Core Data 的默认集合类型是NSSet 而不是NSArray

你可以从返回数组的集合中得到allObjects

if let muscles: Array<Muscle> = (obj.valueForKey("muscles") as! NSSet).allObjects as? Array<Muscle>  ...

但是由于您从 Core Data 模型中知道 muscles 存在,我建议将该属性声明为非可选并省略可选绑定。

let muscles = obj.valueForKey("muscles") as! NSSet

【讨论】:

您也可以使用键入的Set:let muscles = obj.valueForKey("muscles") as! Set&lt;Muscle&gt; 是的,但是 Core Data 使用 Foundation 类型和 Xcode 创建的 NSManaged 子类也将对象声明为 NSSet

以上是关于Swift 2:使用一对多条件保存 coredata的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2.0 一对多的关系——仍然是 NSOrderedSet?

一对多关系设置器

无法使用 Swift 在 CoreData 中访问一对多关系

Swift CoreData 保存一对一的关系

一对多关系CoreData Swift

swift中自定义NSManagedObject类核心数据的问题