2017-12-30 26 views
0

여기에서 내가 뭘 잘못하고 있는지 잘 모르겠다./'NSUnknownKeyException', 이유 : '[<Users 0x78eb5bf0> valueForUndefinedKey :] : 엔터티 사용자가 키 "James"에 대해 키 값 코딩을 준수하지 않습니다.'

원하는 것은 엔티티 내의 코어 데이터 속성에 저장된 모든 데이터를 주어진 이름으로 얻을 수 있어야한다는 것입니다.

예를 들어 사용자 "James"에 대한 모든 정보가 저장됩니다.

func getUserDetails(name: String) { 
    let context = appDelegate.persistentContainer.viewContext 
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 

    request.returnsObjectsAsFaults = false 
    do { 
     let result = try context.fetch(request) 
     for data in result as! [NSManagedObject] { 
      print(data.value(forKey: name) as! String) 
     } 

    } catch { 

     print("Failed") 
    } 
} 

내가 지금 같은이 정보를 설정하고있다 :

func parseJson() { 
     let context = appDelegate.persistentContainer.viewContext 
     let entity = NSEntityDescription.entity(forEntityName: "Users", in: context) 
     let user = NSManagedObject(entity: entity!, insertInto: context) 

     Alamofire.request(jsonLocation).responseJSON { (responseData) -> Void in 
      if((responseData.result.value) != nil) { 
       let swiftyJsonVar = JSON(responseData.result.value!) 


       for (_, value) in swiftyJsonVar { 

        let name = value["name"].stringValue 
        let gender = value["gender"].stringValue 
        let age = value["age"].intValue 

        user.setValue(name, forKey: "name") 
        user.setValue(gender, forKey: "gender") 
        user.setValue(age, forKey: "age") 

        do { 
         try context.save() 
        } catch { 
         print("Failed saving") 
        } 

       } 
      } 
     } 
} 

하지만 난 점점 오전 오류는 다음과 같습니다

'NSUnknownKeyException'를 이유로 여기

내 코드입니다 : '[valueForUndefinedKey :] : 엔티티 Users는 키 "James"에 대해 키 값 코딩을 준수하지 않습니다.'

아이디어가 있으십니까?

p.s. 이것은 UserDetails라는 클래스에 있습니다. 클래스의 기능을하기 전에 클래스 범위 내에서 설정했습니다 :

let jsonLocation = "https://link.to/json/for/users" 
let appDelegate = UIApplication.shared.delegate as! AppDelegate 
+0

클래스 UserDetail은 어디에 있습니까? 오류가 거기에서오고있는 것 같습니다. – Sandeep

+0

앱을 다시 설치하고 확인해 주시겠습니까? –

답변

0

getUserDetails() 메서드가 문제의 원인입니다. 라인

print(data.value(forKey: name) as! String) 

이 전달 된 매개 변수 문자열에 대한 속성 (오히려 문자보다 더 "name")를 받고 있지만 모델에는 속성 James이없는에서

.

당신은 누구의 nameJames 인 레코드를 필터링하고 리터럴 문자열 값을 인쇄하는 술어를 추가해야 "name"

func getUserDetails(name: String) { 
    let context = appDelegate.persistentContainer.viewContext 
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
    request.predicate = NSPredicate(format: "name == %@", name) 

    request.returnsObjectsAsFaults = false 
    do { 
     let result = try context.fetch(request) as! [NSManagedObject] 
     for data in result { 
      print(data.value(forKey: "name") as! String) 
     } 

    } catch { 
     print(error) 
    } 
} 

참고 :이 높게 NSManagedObject 사용하는 것이 좋습니다

하위 클래스를 사용하여 속성에보다 편리하게 액세스 할 수 있습니다. 그것은 그러한 종류의 오류를 피합니다. 더 자세한 변수 이름을 사용하는 것이 좋습니다.

func getUserDetails(name: String) { 
    let context = appDelegate.persistentContainer.viewContext 
    let request = NSFetchRequest<Users>(entityName: "Users") 
    request.predicate = NSPredicate(format: "name == %@", name) 

    request.returnsObjectsAsFaults = false 
    do { 
     let users = try context.fetch(request) 
     for user in users { 
      print(user.name) 
     } 

    } catch { 
     print(error) 
    } 
} 
+0

답장을 보내 주셔서 감사합니다. 나는 coredata에 새로운 오전과 그것이 많이 나타납니다 고투입니다. 나는 술어가 근본적으로 어디에서 가까운 것인가? – JamesG

+0

예, 술어는'where' 절처럼 작동합니다. – vadian

+0

좋습니다. 그것은 약간 지워집니다. 함수를 실행할 때 아무 일도 일어나지 않습니다. viewdidload()에서 실행 중입니다. 아마 데이터가 인터넷의 JSON 파일에서 나왔고, 코드가 alamofire 함수 끝에 추가 되었기 때문일 수도 있습니다. 나는 그것이 지속되어야한다고 생각 했단 말인가? – JamesG