【发布时间】: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<Coordinate>。