2011-10-04 9 views
5

コアデータオブジェクトは、NSFetchRequestを使用するか、グラフの他のオブジェクトとの関係を使用して取得できます。十分に設計されたモデルでは、NSFetchRequestsの使用が最小限に抑えられるような十分な関係(および取得されたプロパティ)が含まれると言うのは公正でしょうか?CoreDataモデルの設計:NSFetchRequestを使いすぎると、あまり設計されていないモデルの兆候ですか?

iOSのカウンタ引数は、NSFetchedRequestControllerです。恐らくAppleが関係やフェッチされたプロパティが既存のフォールディング/キャッシングで満足のいくパフォーマンスを提供していると信じていたら、NSFetchedRequestControllerを作成していないだろう。

NSFetchRequestが優れている場合は、コアデータがSQLite内のすべての作業を実行できるためにインスタンスが存在します。たとえば、集計値をフェッチする例があります。

これについてのご意見はありますか?私はCore Data Programming Guideを見ました。 「管理対象オブジェクトのフェッチ」と「コアデータのパフォーマンス」のセクションには適切なアドバイスがありますが、フェッチ要求との関係を強く示唆するものはありません。

+1

カップルの考えを使用します。アプリケーションの起動間で(1)NSFetchRequestができないキャッシュデータ。 (2)Cocoa TouchのNSFetchedResultsControllerがCocoaのNSArrayControllerを置き換えます。 – paulmelnikow

答えて

0

一般的な経験則では、データモデルが単純であるほど効果的なフェッチが行われ、データモデルが複雑になればなるほど、より良い関係が機能します。

たとえば、データモデルにリレーションシップのない単一のエンティティがある場合、フェッチは隔離された管理オブジェクトを見つけるのに最も効果的です。 2つ以上のリレーションシップを持つダースエンティティを持つデータモデルがある場合は、リレーションシップを頻繁に使用します。

2

私は関係とNSFetchRequestにそれぞれ長所と短所があると言います。開発者は、どちらを使うのが適切かを知っておく必要があります。たとえば、このモデルを取る:

-------------- 1   * ------------ 
| Department |<------------->>| Employee | 
--------------    ------------ 
| name  |    | name  | 
--------------    | age  | 
           | salary | 
           ------------ 

を使用すると、特定の部門に所属するすべての従業員を取得する場合、「department.employees」の関係を追跡することが適切です。述部 'department == xxxx'を持つEmployeeエンティティのNSFetchRequestを作成することは適切ではありません。

逆に給与> xの特定の部署の従業員を検索する場合は、 'department == xxxxx AND salary> x'のような述部を持つNSFetchRequestを使用することが適切です。 department.employees関係を使用してすべての従業員を取得し、それをループで反復して高所得者を見つけることは適切ではありません。

要約すると、関係またはNSFetchRequestsは、本質的に「良い」または「悪い」ではありません。ちょうど適切に使用してください。関係を使用してオブジェクトグラフをナビゲートします。 NSFetchRequestを使用してサブセット検索を実行するか、結果を辞書として返す柔軟性が必要な場合や、NSExpressionsを使用する必要がある場合。

をすべてのコードの上に散らばっNSFetchRequestsの多くは悪いデザインの兆候です:追加する

EDIT。私はいつもカスタムNSManagedObjectクラスにデータリクエストをカプセル化し、ビュー/ビューコントローラコードでコアデータコールを持たないようにします。

フェッチされたプロパティは、同じことを達成する方法です。コアデータエディタを使用するのではなく、コードでNSFe​​tchRequestを作成する方が好きです。はるかに柔軟性がありますが、どちらの方法も同じことになります。

0

コアダータでモデルを設計するとき、モードで1,2、またはnのリレーションがある場合は、オブジェクトグラフがSQLデータベースと同じように動作することを示します最初のリクエストですべてのオブジェクトを明示的に必要とするアプリケーション以外の行。実際、アップルはパフォーマンス上の理由からモデルをリレーション間で分割することを推奨しています。そのため、その時点でのフェッチのモデルフォルトが残りをフェッチします。設計された誤った削除ルールがクラッシュしたり、パフォーマンスに影響を及ぼす可能性があるため、削除ルール(null、カスケード..)を気にする必要があるのは唯一の側面です。 信頼してください。私はコアデータほど効率的ではありません。強力なモデルを作り、コアデータが残りを行います。

私のアプリケーション(マリエット)の一つは、コアデータを使用し、別の(billingfiles)は、SQL