swift2核心数据和处理关系

Posted

技术标签:

【中文标题】swift2核心数据和处理关系【英文标题】:swift2 core data and working with relationships 【发布时间】:2015-08-27 01:22:05 【问题描述】:

我对此进行了一些搜索,所有示例要么是 obj-c,要么在 xcode 7 beta 6 中根本不起作用。

我的 xcode 模型设置如下:

所以我有两个实体,一个叫做 Person,一个叫做 Pet。人有名字。宠物有名字和类型(狗、猫)。 Person 与 Pet 具有一对多关系,而 Pet 与 Person 具有一对一关系。

这是我的简单代码:

import UIKit
import CoreData

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let context: NSManagedObjectContext = appDel.managedObjectContext

        let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context)
        let pet = NSEntityDescription.insertNewObjectForEntityForName("Pet", inManagedObjectContext: context)

        person.setValue("Bill", forKey: "name")
        pet.setValue("Ruff", forKey: "name")
        pet.setValue("Dog", forKey: "type")

        person.setValue(pet, forKey: "pet")

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    


当我运行它时,我收到以下错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'不可接受的值类型 多对多关系:property = "pet";所需类型 = NSSet;给定 类型 = NSManagedObject;价值 = (实体:宠物;id:0x7fa93bc2f4a0

【问题讨论】:

您的宠物关系看起来可能是一对多的,在这种情况下,只需尝试像 pet.person = personpet.setValue(person, forKey:"person") 那样设置相反的关系。或者将其更改为一对一的关系。如果是多对多,则需要将宠物添加到关系集中。像person.pets.add(pet) 这样的东西。我建议对“多”关系使用复数属性描述符以避免混淆。 【参考方案1】:

在一对多的关系中,设置一对一的关系要方便得多。反之亦然,但更复杂,因为您必须将一个对象添加到现有对象的可能NSSet

pet.person = person

(使用正确的NSManagedObject 子类。)

【讨论】:

【参考方案2】:

原来我需要创建类文件。一旦我创建了它们,一切都开始正常工作。

【讨论】:

以上是关于swift2核心数据和处理关系的主要内容,如果未能解决你的问题,请参考以下文章

iPhone核心数据关系

iPhone核心数据递归关系

iOS核心数据一对多关系NSSET

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

在导入核心数据的同时建立关系?

核心数据关系,如何从关系中插入和检索数据