为什么我得到"实体X不符合键值编码"?

时间:2017-04-08 12:29:59

标签: ios swift core-data

当我运行以下代码时:

    let saveAction = UIAlertAction(title: "Save",
                                   style: .default) {
    [unowned self] action in
    guard let textField = alert.textFields?.first,
    let mapName = textField.text else {
    return
    }
    var newCoordinate = NSEntityDescription.insertNewObject(forEntityName: "Coordinates", into: managedObjectContext)

    var newMap = NSEntityDescription.insertNewObject(forEntityName: "MapNames", into: managedObjectContext)

    newCoordinate.setValue(23, forKey: "latitude")
    newCoordinate.setValue(21, forKey: "longitude")
    newMap.setValue(mapName, forKey: "mapname")

    do
    {
    try self.appDelegate.saveContext()
    print("SAVED")
    }
    catch
    {
    }

    var request = NSFetchRequest<NSFetchRequestResult>(entityName: "Coordinates")
    request.returnsObjectsAsFaults = false

    do
    {
    var results = try managedObjectContext.fetch(request)

        if results.count > 0 {
        for result in results as! [NSManagedObject]
        {
            if let latitude = result.value(forKey: "latitude") as? Double
            {
            print(latitude)
            }
            if let longitude = result.value(forKey: "longitude") as? Double{
            print(longitude)}
            if let map = result.value(forKey: "mapname") as? String {
            print(map)}

        }
    }
    }
    catch
    {
    }

我收到以下错误:

  

因未捕获的异常终止应用&#39; NSUnknownKeyException&#39;,   原因:&#39; [valueForUndefinedKey:] :.   实体坐标不是密钥的密钥值编码兼容   &#34;映射名&#34;&#39;

这很奇怪,因为我确实有一个名为mapname的属性,尽管它在MapNames实体中。错误说坐标,为什么会这样?

是否因为在同一范围内无法对managedObjectContext进行2次引用?我怎么能将值插入到不同的实体呢?

2 个答案:

答案 0 :(得分:3)

您的插入代码没有问题。但是,让我们看看你的提取代码:

var request = NSFetchRequest<NSFetchRequestResult>(entityName: "Coordinates")

在这里,您要创建一个获取坐标的请求。

您正在调用的请求结果(Coordinates):

if let map = result.value(forKey: "mapname") as? String {
   print(map)
}

这显然是不正确的。

理想情况下,您应该使用Coordinates的{​​{1}}子类而不是使用危险的KVC,而是直接使用属性:

NSManagedObject

答案 1 :(得分:1)

升级到Swift 4后,我也遇到了同样的错误。

我必须将 @objcMembers 添加到我的Entity类(或将 @objc 添加到该类的每个属性)。