0

私は3つのエンティティを持っています:

  • Notification
  • PlanDate
  • User

関係:

  • Notificationと一対一の関係にあるPlanDate
  • Notificationとの対多関係もありますUser

コード:

NSLog (@"Selected Object From  Detail ViewDidLoad %@", managedObject);
NSManagedObject *planDateObject = ((PlanDate *)[managedObject valueForKey:@"plandate"]);        
NSLog(@"planDateObject %@", planDateObject);
NSString *recipientUserName = [planDateObject valueForKey:@"recipientUserName"];
NSLog(@"recipientUserName: %@", recipientUserName);

ログは次のとおりです。

2013-08-21 12:26:50.349 Time[5018:c07] Selected Object From  Detail ViewDidLoad <Notification: 0xa58ee70> (entity: Notification; id: 0xb2a5480 <x-coredata://C0FB76AD-19EB-42BA-981A-F99DD6DCF6C7-5018-0000101A36CFA3D1/Notification/p0B2ABAC1-77F3-4F46-B14D-34652F148B37> ; data: {
appType = 1;
invitationType = PlanDate;
lastmoddate = "2013-08-21 17:42:42 +0000";
"notification_id" = "0B2ABAC1-77F3-4F46-B14D-34652F148B37";
plandate = "0xa1c9350 <x-coredata://C0FB76AD-19EB-42BA-981A-F99DD6DCF6C7-5018-0000101A36CFA3D1/Notification/p1C004B2B-F1DA-4EE0-9FAC-0A89E0DBCDB7>";
users = "<relationship fault: 0xb2aa210 'users'>";
})
2013-08-21 12:26:50.350 Time[5018:c07] planDateObject <Notification: 0xb292800> (entity: Notification; id: 0xa1c9350 <x-coredata://C0FB76AD-19EB-42BA-981A-F99DD6DCF6C7-5018-0000101A36CFA3D1/Notification/p1C004B2B-F1DA-4EE0-9FAC-0A89E0DBCDB7> ; data: <fault>)
2013-08-21 12:26:53.406 Time[5018:c07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Notification 0xb292800> valueForUndefinedKey:]: the entity Notification is not key value coding-compliant for the key "recipientUserName".'

確かに、値を持つ属性「recipientUserName」があります。同じログを生成する他の属性を試しました。

エラーの理由 属性にアクセスしようとすると、データがエラーとして表示されるのはなぜですか?

編集

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

1

recipientUserNameエラー メッセージは、エンティティに名前が付けられた属性が実際には存在しないことを示していますNotification。何が起こったのかを確認するために、結果を実行してみましょう。最初にこれを行います:

NSLog (@"Selected Object From  Detail ViewDidLoad %@", managedObject);

結果は次のとおりです。

2013-08-21 12:26:50.349 Time[5018:c07] Selected Object From  Detail ViewDidLoad <Notification: 0xa58ee70> (entity: Notification; id: 0xb2a5480 <x-coredata://C0FB76AD-19EB-42BA-981A-F99DD6DCF6C7-5018-0000101A36CFA3D1/Notification/p0B2ABAC1-77F3-4F46-B14D-34652F148B37> ; data: {
appType = 1;
invitationType = PlanDate;
lastmoddate = "2013-08-21 17:42:42 +0000";
"notification_id" = "0B2ABAC1-77F3-4F46-B14D-34652F148B37";
plandate = "0xa1c9350 <x-coredata://C0FB76AD-19EB-42BA-981A-F99DD6DCF6C7-5018-0000101A36CFA3D1/Notification/p1C004B2B-F1DA-4EE0-9FAC-0A89E0DBCDB7>";
users = "<relationship fault: 0xb2aa210 'users'>";
})

これはmanagedObjectが のインスタンスでありNotificationNotificationの属性が次のとおりであることを示しています。

  • appType
  • invitationType
  • lastmoddate
  • notification_id
  • plandate
  • users

このplandate属性は、実際には 1 対 1 の関係です。ログ メッセージによると、この関係のもう一方の端にあるオブジェクトは、別のインスタンスですNotification(x-coredata管理対象オブジェクト ID 表現で示されます)。これが のインスタンスであることを意味していたとPlanDate思いますが、ログ メッセージには、これは実際にあるものではないことが示されています。

次にこれを行います。

NSManagedObject *planDateObject = ((PlanDate *)[managedObject valueForKey:@"plandate"]);        
NSLog(@"planDateObject %@", planDateObject);

結果は次のとおりです。

2013-08-21 12:26:50.350 Time[5018:c07] planDateObject <Notification: 0xb292800> (entity: Notification; id: 0xa1c9350 <x-coredata://C0FB76AD-19EB-42BA-981A-F99DD6DCF6C7-5018-0000101A36CFA3D1/Notification/p1C004B2B-F1DA-4EE0-9FAC-0A89E0DBCDB7> ; data: <fault>)

したがって、タイプが何か疑問がある場合planDateObjectは、これで間違いありません。それは間違いなくNotificationエンティティのインスタンスです。への型キャストは、PlanDateここでは何の意味もありません。ここではデータが<fault>正常に表示されているという事実は、この時点ではその属性にアクセスしようとしていないためです。

最後にこれを行います:

NSString *recipientUserName = [planDateObject valueForKey:@"recipientUserName"];

recipientUserName属性の値を取得しようとしています。しかし、それがであり、その名前の属性がないことplanDateObjectは既にわかっています。そのため、存在しないキーにアクセスしようとすると例外が発生します。NotificationNotification

したがって、エンティティに という名前の属性がある場合、問題は関係が間違ったオブジェクトを指していることです。がその属性を持っていない場合は、提供した情報からは解決できない、より複雑な問題が発生しています。PlanDaterecipientUserNameplandatePlanDate

于 2013-08-21T19:59:18.620 に答える