为关系内部的属性设置值时“无法调用 NSManagedObject 类上的指定初始化程序”(核心数据)
Posted
技术标签:
【中文标题】为关系内部的属性设置值时“无法调用 NSManagedObject 类上的指定初始化程序”(核心数据)【英文标题】:"Failed to call designated initializer on NSManagedObject class" when setting value for properties inside relationship (Core Data) 【发布时间】:2020-08-31 21:12:54 【问题描述】:我正在尝试使用.setValue(value:, forKeyPath:)
方法更新我的核心数据模型的一些属性。在我的模型中,我有一个名为“Alumno”的实体,它有一个名为“especialidadRelacionada”的属性,该属性与另一个名为“Especialidad”的实体相关。这是一个多对一的关系,因为一个“Alumno”只能有一个“Especialidad”,尽管一个“Especialidad”可以匹配多个“Alumnos”。 “Especialidad”实体也有“名词”作为其主要属性。这里有两个 swift 文件,由 Xcode 生成,来自开发者文件夹的深处:
extension Alumno
@nonobjc public class func fetchRequest() -> NSFetchRequest<Alumno>
return NSFetchRequest<Alumno>(entityName: "Alumno")
@NSManaged public var correo: String?
@NSManaged public var foto: Data?
@NSManaged public var movil: String?
@NSManaged public var nombre: String?
@NSManaged public var repertorio: String?
@NSManaged public var cursoRelacionado: Curso?
@NSManaged public var ensayosRelacionados: NSSet?
@NSManaged public var especialidadRelacionada: Especialidad?
@NSManaged public var tutorRelacionado: Tutor?
extension Especialidad
@nonobjc public class func fetchRequest() -> NSFetchRequest<Especialidad>
return NSFetchRequest<Especialidad>(entityName: "Especialidad")
@NSManaged public var nombre: String?
@NSManaged public var alumno: NSSet?
@NSManaged public var obra: NSSet?
我从用户写入的文本字段中获取要设置的“Especialidad”字符串:
@IBOutlet weak var especialidadField: UITextField!
但是,当我尝试使用用户写入的字符串更新“Especialidad”数据(以前完全没有问题保存到 Core Data)时:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
alumno?.setValue(especialidadField.text, forKey: "especialidadRelacionada.nombre")
do
try context.save()
catch
...
我收到此错误:“无法在 NSManagedObject 类上调用指定的初始化程序”。我的“forKey”字符串似乎有问题,但是在互联网上找了这么多时间之后,我找不到什么。
谢谢!
【问题讨论】:
该错误与您发布的代码无关。有关该错误的说明,请参阅 here。 但是我在五月开始时已经正确定义了我的“Alumno”和“Especialidad”,我想: ... 和其他不相关的属性更新没有问题。所以实例的初始化是正确的,我认为: 我认为您的forKey:
的问题在于您应该使用forKeyPath:
来遍历关系。
谢谢!我也这么认为。但是我没有找到符合我需要的确切语法。有什么建议吗?
【参考方案1】:
var alumno: Alumno?
var esNuevo: Bool = true
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var especialidadSeleccionada: Especialidad?
var cursoSeleccionado: Curso?
var tutorSeleccionado: Tutor?
【讨论】:
以上是关于为关系内部的属性设置值时“无法调用 NSManagedObject 类上的指定初始化程序”(核心数据)的主要内容,如果未能解决你的问题,请参考以下文章