当我运行以下代码时:
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次引用?我怎么能将值插入到不同的实体呢?
答案 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 添加到该类的每个属性)。