7

Restkit を使用してサーバーから Json データをマッピングしており、db から取得してそれらのデータを表示しています。私のビューには、上記の操作を再度実行する更新ボタンがあります。

シナリオ: 1 対 1 の関係を持つ 2 つのテーブル Key と Profile があります。次のコードを使用してDBからデータを取得しています

NSFetchRequest *fetchRequest = [Key fetchRequest];
[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"Profile"]];
[fetchRequest setIncludesSubentities:YES];
NSArray *sortedObjects = [Key executeFetchRequest:fetchRequest]; 

上記の配列は、DB 内のすべてのオブジェクトを返します。しかし、ブレークポイントを使用して確認すると、すべてのデータが表示されない理由であるコアデータ障害が発生しました。

//sortedObjects のすべてのデータはこのようなものです。

<Key: 0x889f2f0> (entity: Key; id: 0x889e400 <x-coredata://981A476D-55AC-4CB4-BBD8-E0285E522412/Key/p1489> ; data: <fault>)

何か案が

4

2 に答える 2

22

これは、「障害」とは何かについて誤解している可能性があります。

Appleのドキュメントで説明されているように:

フォールトは、Core Data がアプリケーションのメモリ使用量を削減するために採用するメカニズムです。

フォルトは、まだ完全には実現されていない管理対象オブジェクトを表すプレースホルダー オブジェクト、または関係を表すコレクション オブジェクトです。

そのため、Core Data を操作しているときにログに「障害」という単語が表示されても、エラーが発生したことを意味するわけではありません。アプリでどのような予期しない動作が見られますか?

于 2012-10-24T10:40:48.143 に答える
19

あなたは実際に問題を説明していません。コア データ フォールトはエラーではなく、ファイル システムのページ フォールトに似ています。これは、データがまだ読み取られていないことを意味します。あなたが説明していることは完全に正常であり、期待されています。返されたオブジェクトのいずれかの属性にアクセスすると、障害が自動的に埋められ、結果が表示されます。したがって、Keyエンティティに という属性があるname場合でも、必要に応じて値を検索し、nameログに記録することもできます。

フェッチリクエストを実行する前にこれを追加することで、強制的に障害を埋めることができます:

[fetchRequest setReturnsObjectsAsFaults:NO];

ただし、これは必須ではなく、持っている属性とフェッチするオブジェクトの数によっては、実際に必要なよりも多くのメモリを使用する可能性があります。

于 2012-10-25T00:36:34.840 に答える