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<Muscle>
是的,但是 Core Data 使用 Foundation 类型和 Xcode 创建的 NSManaged
子类也将对象声明为 NSSet
。以上是关于Swift 2:使用一对多条件保存 coredata的主要内容,如果未能解决你的问题,请参考以下文章
Swift 2.0 一对多的关系——仍然是 NSOrderedSet?