【问题标题】:cannot resolve one-to-many relationship无法解决一对多关系
【发布时间】:2018-08-31 00:16:28
【问题描述】:

我尝试理解 coredata。进展顺利的是添加 Hond 和 gewicht。那是巧妙地把gewicht放在关系中。但是当我想稍后添加一个额外的gewicht时,我遇到了一个我无法做到的问题。

我看到以下消息:

NSManagedObject' 不能转换为 'Hond'

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

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?

【问题讨论】:

  • hond1.setValue(hond1, forKey: "Hond"):这很奇怪。

标签: swift core-data nsmanagedobject


【解决方案1】:

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

为避免命名混淆,强烈建议使用对应实体名称命名关系,并以单数形式命名一对一关系,以复数形式命名一对多关系。一对多关系应命名为gewichten。 Swift 中的类型应该是 Set&lt;GewichtHond&gt; 而不是未指定 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") 更方便(更安全)。

【讨论】:

  • 有点离题,但我认为仍然相关:您是否自己创建NSManagedObject 类以避免非泛型NSSetNSOrderedSet?我才刚刚明白,上次我读到它时我在想为什么要为自己做额外的工作..
  • 是的,我愿意。我总是使用 Menu Editor > Create NSManagedObject subclasses 创建类,然后手动编辑类以将 NS 类型替换为原生 Swift 类型,并删除(尽可能多的)非可选属性的问号
  • 手动维护工作量大吗?如果我忘记了一个变量,是否会出现错误?
  • 当然手动工作比自动创建的东西更容易出错。但实际上它并没有那么多工作。当您在更改模型后立即更新类时,工作量非常低。
  • 希望我正确理解了您的回答。但是,我现在收到以下消息,我不知道出了什么问题。我在我的问题中更新了我的代码。我在 Xcode 中遇到的错误是:NSManagedObject' 不能转换为 'Hond'
猜你喜欢
  • 1970-01-01
  • 2016-09-22
  • 2016-02-16
  • 2017-02-20
  • 1970-01-01
相关资源
最近更新 更多