2017-12-30 12 views
0

ここで間違っていることがわかりません:/'NSUnknownKeyException'、理由: '[<Users 0x78eb5bf0> valueForUndefinedKey:]:エンティティUsersがキー "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はありません。

非常NSManagedObjectを使用することをお勧めします:あなたが注意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) 
    } 
} 

の値を印刷する述語を追加する必要が

サブクラスを使用すると、属性へのより便利なアクセスが可能になります。この種のエラーを回避します。さらにわかりやすい変数名を使用することをお勧めします。

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

関連する問題