无法解决一对多的关系

问题描述 投票:0回答:1

我试着理解coredata。什么是好的是添加一个Hond和gewicht。这是巧妙地把gewicht放在关系中。但是,当我想稍后添加一个额外的gewicht时,我遇到了一个我无法做到的问题。

我看到以下消息:

NSManagedObject'无法转换为'Hond'

My enitys

这是我尝试添加重量的代码

guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
        let context = appDelegate.persistentContainer.viewContext

        let hondEntity = NSEntityDescription.entity(forEntityName: "Hond", in: context)!
        let hond = NSManagedObject(entity: hondEntity, insertInto: context)

        let gewichtHondEntity = NSEntityDescription.entity(forEntityName: "GewichtHond", in: context)!
        let gewichtHond = NSManagedObject(entity: gewichtHondEntity, insertInto: context)

        let nieuwGewicht = GewichtHond(context: context)
        nieuwGewicht.datum = Date()
        nieuwGewicht.gewicht = Double("38")!
        //gewichtHond.setValue(Date(), forKey: "datum")
        //gewichtHond.setValue(Double("38"), forKey: "gewicht")
        Hond.addToGewichten(gewichtHond) //NSManagedObject' is not convertible to 'Hond

        do {
            try context.save()
            print("Saved")
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }

我的Hond + CoreDataProperties.swift

    extension Hond {

        @nonobjc public class func fetchRequest() -> NSFetchRequest<Hond> {
            return NSFetchRequest<Hond>(entityName: "Hond")
        }

        @NSManaged public var chipnummer: Int64
        @NSManaged public var dierenarts: String?
        @NSManaged public var geboortedatum: Date
        @NSManaged public var geslacht: Int16
        @NSManaged public var hondId: String?
        @NSManaged public var kleur: String?
        @NSManaged public var naam: String?
        @NSManaged public var orderID: Int16
        @NSManaged public var plaatsVanChip: String?
        @NSManaged public var telefoonnummerDierenarts: String?
        @NSManaged public var vachttype: String?
        @NSManaged public var gewichten: Set<GewichtHond>

    }

    // MARK: Generated accessors for gewichten
    extension Hond {

        @objc(addGewichtenObject:)
        @NSManaged public func addToGewichten(_ value: GewichtHond)

        @objc(removeGewichtenObject:)
        @NSManaged public func removeFromGewichten(_ value: GewichtHond)
/*
       @objc(addGewichten:)
       @NSManaged public func addToGewichten(_ values: NSSet)

       @objc(removeGewichten:)
       @NSManaged public func removeFromGewichten(_ values: NSSet)
*/ 
    }

如何设置添加额外的gewicht?

swift core-data nsmanagedobject
1个回答
2
投票

该错误有点误导。基本上它说gewicht关系的类型是一个集合而不是数字。这也表明了对gewichtGewichtHond属性的干扰。

为了避免命名混淆,强烈建议将对应关系与对应的实体名称和单数形式的一对一关系以及复数形式的一对多关系命名。一对多关系应命名为gewichten。 Swift中的类型应该是Set<GewichtHond>而不是未指定的NSSet

要在一个集合中添加和删除GewichtHond实例,Hond子类中至少需要这两个访问器方法

// MARK: Generated accessors for gewichten
extension Hond {

    @objc(addGewichtenObject:)
    @NSManaged public func addToGewichten(_ value: GewichtHond)

    @objc(removeGewichtenObject:)
    @NSManaged public func removeFromGewichten(_ value: GewichtHond)

}

现在创建一个Hond实例和一个GewichtHond实例,并将后者添加到关系集中

let hond = NSEntityDescription.insertNewObject(forEntityName: "Hond", into: context) as! Hond
let gewichtHond = NSEntityDescription.insertNewObject(forEntityName: "GewichtHond" , into: context) as! GewichtHond

hond.addToGewichten(gewichtHond)

旁注:在NSManagedObject子类中,点符号hond1.datum = Date()比KVC方法hond1.setValue(Date(), forKey: "datum")更方便(和更安全)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.