【问题标题】:Why do I get "entity X is not key value coding-compliant"?为什么我得到“实体 X 不符合键值编码”?
【发布时间】:2017-04-08 12:29:58
【问题描述】:

当我运行以下代码时:

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

我收到以下错误:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因:'[valueForUndefinedKey:]: 实体坐标与键的键值编码不兼容 “地图名称”。'

这很奇怪,因为我确实有一个名为 mapname 的属性,尽管它位于 MapNames 实体中。错误显示坐标,这是为什么呢?

这是因为在同一范围内不可能有 2 个对 managedObjectContext 的引用吗?那我怎样才能将值插入不同的实体呢?

【问题讨论】:

  • if let map = result.value(forKey: "mapname") as? String 显然是在尝试读取 mapname 实例上的属性 Coordinates 因为这是您的请求正在获取的内容。如果您正确应用了泛型类型,那应该很明显。您的请求应该是NSFetchRequest&lt;Coordinate&gt;

标签: ios swift core-data


【解决方案1】:

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

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

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

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

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

这显然是不正确的。

理想情况下,您应该使用NSManagedObjectCoordinates 子类并直接使用属性,而不是使用危险的KVC:

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

... 

for result in results as! [Coordinates] {
   print(result.latitude)
   print(result.longitude)
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我遇到了同样的错误,并使用下面的代码让它在 sectionNameKeyPath 中工作。 @objc public var modifiedMonth:字符串? { return modified?.monthMedium }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多