2017-04-08 17 views
0

當我運行下面的代碼:爲什麼我會得到「實體X不符合密鑰值編碼」?

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

我得到以下錯誤:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ valueForUndefinedKey:]: the entity Coordinates is not key value coding-compliant for the key "mapname".'

這是奇怪,因爲我有一個名爲映射名稱的屬性,雖然它是在MapNames實體。這個錯誤說座標,爲什麼?

這是因爲在同一範圍內不可能有2個對managedObjectContext的引用?我怎樣才能將值插入不同的實體呢?

+0

'如果讓地圖= result.value(forKey: 「映射名稱」)作爲? String'顯然是試圖讀取'Coordinates'實例上的'mapname'屬性,因爲這是你的請求獲取的內容。如果你正確地應用泛型,這應該是顯而易見的。你的請求應該是'NSFetchRequest '。 – Sulthan

回答

2

插入代碼沒有問題。但是,讓我們看看您的取回代碼:

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

此處您正在創建一個獲取座標的請求。

對這項請求的結果(這是一個Coordinates)您呼叫:

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

這顯然是不正確。

理想的情況下,而不是使用危險的KVC,您應該使用Coordinates子類的NSManagedObject並直接使用屬性:

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

... 

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

感謝您的洞察力。 – konyv12

相關問題