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
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