2

1 つの家を持つことができる Person という名前のエンティティと、1 ~ N 個の家を持つことができる Home という名前のエンティティがあります。

ここに画像の説明を入力

次に、2 つのアレイ コントローラーがあります。

  1. 管理対象オブジェクト コンテキストにバインドされたホーム コントローラー、エンティティ モード: ホーム。
  2. エンティティ モードの管理対象オブジェクト コンテキストにバインドされた People コントローラー: person。

People Controller にバインドされたセル ベースのテーブル ビューがあります。最初の 3 つの列 (名前、姓、年齢) を正常に表示できますが、問題は 4 番目の列 (家の名前) にあります。ポップアップ ボタン セル、これらはバインドです。

  • 内容: 家 Controller.arrangedObjects ;
  • コンテンツ値: ホーム Controller.arrangedObjects.name;
  • 選択したオブジェクト: People Controller.home。

ポップアップボタンをクリックしてホームを選択しようとすると、実行時に問題が発生します。

ここに画像の説明を入力

ご覧のように、選択肢の代わりに「Core data Relationship fault」が表示されます。メニュー項目をクリックしてホームを変更しようとすると、コンソールに多くのコードが出力され、最も重要な行のみが投稿されます。

2012-11-04 01:47:45.181 Test[4390:303] [<NSManagedObject 0x100156e60> valueForUndefinedKey:]: the entity Home is not key value coding-compliant for the key "(null)".

そして、この後、アプリケーションがフリーズします。

編集:いくつかのデバッグにより、例外が発生したときのオブジェクトの状態を知ることができるようになりました:

2012-11-09 02:42:02.495 Test[4650:303] <NSManagedObject: 0x100157460> (entity: Person; id: 0x10013d9d0 <x-coredata:///Person/t0182F6F4-9CCC-4F51-A82F-D00CE026DB752> ; data: {
    age = 20;
    home = "0x101953480 <x-coredata:///Home/t0182F6F4-9CCC-4F51-A82F-D00CE026DB753>";
    name = "New Name";
    surname = "New Surname";
})
2012-11-09 02:42:02.497 Test[4650:303] <NSManagedObject: 0x101953420> (entity: Home; id: 0x101953480 <x-coredata:///Home/t0182F6F4-9CCC-4F51-A82F-D00CE026DB753> ; data: {
    name = "New Home";
    people =     (
        "0x10013d9d0 <x-coredata:///Person/t0182F6F4-9CCC-4F51-A82F-D00CE026DB752>"
    );

値は規則的で、nil キーはないようです。問題はバインディングにあると思われます。

4

2 に答える 2

5

Core Data からオブジェクトとそれらの関係を取得する方法を確認せずに、実際に何が起こっているのかを知ることは困難です。

ただし、「障害」という言葉が表示されたからといって、実際に問題があるとは限りません。Core Data Fault は、データがまだストアから管理対象オブジェクト コンテキストに取得されていないことを意味します。

フォルトは非常に便利です。それらは、関係にあるオブジェクトの代わりになる小さなスタブのようなもので、あまり記憶に引っ張らないようにします。実際のオブジェクトと交換されるのは、オブジェクトにアクセスしようとしたときだけです。

もう少し詳しい説明については、Core Data Relationship Faultを参照してください。

于 2012-11-11T16:27:16.190 に答える
1

Home-people と Person-home は、適切に機能するために、モデル ビルダーを使用して相互の逆の関係として宣言する必要があります。リレーションシップは 1 本の線として表示されます。

于 2012-11-04T03:09:56.050 に答える