Core data Swift3-在核心数据中插入关系

Core data Swift3-在核心数据中插入关系,core-data,swift3,Core Data,Swift3,我有两个实体,即 诊所 系 他们之间的关系是多对多的。i、 诊所有许多科室,科室有许多相关的诊所 我已经在coredata.xcdatamodeld中设置了实体,并生成了NSManagedObject类。图中的PFA 我有以下代码,负责插入科室和诊所 import Foundation import CoreData import SwiftyJSON import Kingfisher class InstallManager { let moc = NetworkManager

我有两个实体,即

  • 诊所
  • 他们之间的关系是多对多的。i、 诊所有许多科室,科室有许多相关的诊所

    我已经在
    coredata.xcdatamodeld
    中设置了实体,并生成了
    NSManagedObject
    类。图中的PFA

    我有以下代码,负责插入科室和诊所

    import Foundation
    import CoreData
    import SwiftyJSON
    import Kingfisher
    
    class InstallManager {
    
        let moc = NetworkManager.managedObjectContext
        let data: JSON!
    
        init(withData data: JSON) {
            self.data = data
        }
    
        // Install Department
        private func installDepartment() {
            for(_,jsonData):(String, JSON) in self.data["deparment"]["list"] {
                let department = NSEntityDescription.insertNewObject(forEntityName: "Department", into: moc)
                department.setValue(jsonData["id"].int32, forKey: "id")
                department.setValue(jsonData["name"].string, forKey: "name")
                department.setValue(jsonData["icon"].string, forKey: "icon")
                department.setValue(jsonData["slug"].string, forKey: "slug")
                department.setValue(jsonData["revision"].int32, forKey: "revision")
                do {
                    try moc.save()
                } catch {
                    fatalError("\(error)")
                }
            }
        }
    
        // Install Clinic
        private func installClinic() {
            let departmentList = fetchDepartmentList()
            for (_,jsonData):(String, JSON) in self.data["clinic"]["list"] {
                let coverPictureAbsolute = "\(jsonData["cover_picture"].string!)"
                let coverPictureRelative = (coverPictureAbsolute as NSString).lastPathComponent
                let clinic = NSEntityDescription.insertNewObject(forEntityName: "Clinic", into: moc)
                clinic.setValue(jsonData["id"].int32, forKey: "id")
                clinic.setValue(jsonData["name"].string, forKey: "name")
                clinic.setValue(jsonData["slogan"].string, forKey: "slogan")
                clinic.setValue(jsonData["profile"].string, forKey: "profile")
                clinic.setValue(jsonData["address"].string, forKey: "address")
                clinic.setValue(jsonData["telephone"].string, forKey: "telephone")
                clinic.setValue(jsonData["email"].string, forKey: "email")
                clinic.setValue(jsonData["website"].string, forKey: "website")
                clinic.setValue(coverPictureRelative, forKey: "cover_picture")
                clinic.setValue(jsonData["latitude"].string, forKey: "latitude")
                clinic.setValue(jsonData["longitude"].string, forKey: "longitude")
                clinic.setValue(jsonData["slug"].string, forKey: "slug")
                clinic.setValue(jsonData["revision"].int32, forKey: "revision")
    
                let clinicEntity = clinic.value(forKeyPath: "departments") as! Clinic
                for department in departmentList {
                    clinicEntity.addToDepartments(department)
                    print(department.name!)
                }
    
                do {
                    try moc.save()
                } catch {
                    fatalError("\(error)")
                }
            }
        }
    
        private func fetchDepartmentList() -> [Department] {
            var departmentList:[Department]!
            let request: NSFetchRequest<Department> = Department.fetchRequest()
            do {
                departmentList = try moc.fetch(request)
            } catch {
                fatalError("Cannot fetch clinics list \(error)")
            }
            return departmentList
        }
    
        public func install() {
            self.installDepartment()
            self.installClinic()
        }
    }
    
    但是这一行给我带来了以下错误

    Could not cast value of type '_NSFaultingMutableSet' to 'APP.Clinic'
    
    这里的问题是什么?如何设置关系

    更新:

    以下是从核心数据自动生成的类(NSManagedObject子类)

    //文件名:Clinic.swift
    进口基金会
    导入CoreData
    @objc(诊所)
    公立诊所:NSManagedObject{
    }
    //文件名:Clinic+CoreDataProperties
    进口基金会
    导入CoreData
    推广诊所{
    @nonobjc公共类func fetchRequest()->NSFetchRequest{
    返回NSFetchRequest(entityName:“诊所”);
    }
    @NSManaged公共变量地址:字符串?
    @NSManaged public var封面图片:字符串?
    @NSV管理的公共var电子邮件:字符串?
    @NSManaged公共变量id:Int32
    @NSManaged公共var纬度:NSDecimalNumber?
    @NSManaged public var经度:NSDecimalNumber?
    @NSManaged公共变量名称:字符串?
    @NSManaged公共var配置文件:字符串?
    @NSM管理的公共var版本:Int32
    @NSManaged公共var口号:字符串?
    @NSManaged public var slug:字符串?
    @NSV管理的公共var电话:字符串?
    @NSV管理的公共var网站:字符串?
    @NSV管理的公共var部门:NSSet?
    }
    //标记:为部门生成的访问者
    推广诊所{
    @objc(添加部门对象:)
    @NSManaged public func addToDepartments(\值:Department)
    @objc(移除的部门对象:)
    @NSManaged public func removeFromDepartments(\值:Department)
    @objc(添加部门:)
    @NSManaged public func addToDepartments(u值:NSSet)
    @objc(搬迁部门:)
    @NSManaged public func removeFromDepartments(u值:NSSet)
    }
    
    对于
    对多关系,您需要获取
    可变setvalueforkey
    ,因为类型是
    NSSet
    而不是
    Clinic

    let clinicEntity = clinic.mutableSetValue(forKey: "departments")
    for department in departmentList {
        clinicEntity.add(department)
        print(department.name!)
    }
    
    或者更简单

    let clinicEntity = clinic.mutableSetValue(forKey: "departments")
    clinicEntity.addObjects(from: departmentList)
    
    要使用自动生成的方法,可以替换

    let clinicEntity = clinic.value(forKeyPath: "departments") as! Clinic
       for department in departmentList {
       clinicEntity.addToDepartments(department)
          print(department.name!)
       }
    

    PS:例如,我建议使用更方便的点表示法

    department.id = jsonData["id"].int32
    department.name = jsonData["name"].string
    department.icon = jsonData["icon"].string
    department.slug = jsonData["slug"].string
    department.revision = jsonData["revision"].int32
    

    这很有效,谢谢。我想知道核心数据生成的类(NSManagedObject)中提供的方法
    @NSManaged public func addToDepartments(value:Department)
    有什么用途我没有注意到这些方法是自动生成的。很好,用它们代替
    mutableSetValueForKey
    这是我不能做的部分。它向我抛出了一个错误,我已经用它自动生成的两个类更新了我的问题。PS:既然你正在使用
    NSManagedObject
    子类,为什么不编写
    clinic.name=jsonData[“name”].string
    而不是
    clinic.setValue(jsonData[“name”].string,forKey:“name”)
    ?如果我能做到,那就太棒了,但是,因为clinic是NSEntityDescription的一个实例,我该如何让它工作呢?你能帮我举个例子吗?
    let clinicEntity = clinic.value(forKeyPath: "departments") as! Clinic
       for department in departmentList {
       clinicEntity.addToDepartments(department)
          print(department.name!)
       }
    
    clinic.addToDepartments(NSSet(array: departmentList))
    
    department.id = jsonData["id"].int32
    department.name = jsonData["name"].string
    department.icon = jsonData["icon"].string
    department.slug = jsonData["slug"].string
    department.revision = jsonData["revision"].int32