2011-08-17 12 views
1

私はコアデータのプログラミングガイドでこれを読んで:多くの場合コアデータフェッチプロパティとNSFetchedResultsController

を、あなたの最初のフェッチオブジェクトグラフ内の開始ノードを取得し、その後、あなたはフェッチ要求を実行していない、あなた単に関係に従ってください。

これは、すべてが1つのオブジェクトにリンクされている場合に意味があります。

しかし、私はこのオブジェクトモデルとの関係

Company (one to many) Team (one to many) Employee (one to one) Role

を持っていると言うが、私はフェッチ要求で開始時に自分の会社をロード言います。私はチームのセットにアクセスし、各チームには従業員のセットがあります。

(これはすべて架空のですが、私のアプリは、同じモデルを次の)

私は「開発者の役割を持つすべての従業員を一覧表示のUITableViewをロードしたい、と私はNSFetchedResultsControllerを使用してこれを実行したいです。

私はすべての「開発者」を返すCompanyで取得されたプロパティを作成したいと思います。どちらが簡単なの?

このフェッチされたプロパティをNSFetchedResultsControllerにどのようにリンクしますか?

答えて

1

私はあなたの質問を理解していませんが、NSFetchedResultsControllerを使用する場合は、NSFetchRequestを使用する必要があります。

フェッチされたコントローラでこの要求をNSFetchedResultsControllerに渡す必要があるため、すでにフェッチ要求があるようです。

NSEntityDescription *entityDescription = ..... 

あなたがあなたの財産を見つけるまで、あなたはすべての配列のプロパティとサイクルを呼び出すことができます:あなたは、エンティティの説明を調べてNSFetchedPropertyDescriptionを取得し、そのプロパティことができますしかし

NSArray *allProperties = entityDescription.properties; 
NSFetchedPropertiesDescription *myPropertyDescription; 
for(NSPropertyDescription *propertyDescription in allProperties) { 
    // find it by name or class 
    if([propertyDescription isKindOfClass:[NSFetchedPropertyDescription class]]) 
    myPropertyDescription = (NSFetchedPropertyDescription*)propertyDescription; 
} 

NSFetchedRequest *fetchRequest = [myPropertyDescription fetchRequest]; 

     NSFetchedResultsController *myController = [[NSFetchedResultsController alloc] 
               initWithFetchRequest:fetchRequest 
               managedObjectContext:myManagedObjectContext 
               sectionNameKeyPath:nil 
               cacheName:myCacheName]; 

私は今のMacを持っていないので、コードの正当性をテストすることはできませんが、正しいはずです。

+0

うん、これはかなり面白そうに見えますが、私が必要とするものかもしれません。私は今夜​​これをテストし、結果をフォローアップします。ありがとう。 – bandejapaisa

+0

ここでは、プロパティの説明からフェッチ要求を取得するために行っている操作をより簡潔に説明します: 'NSEntityDescription * entity = [NSEntityDescription entityForName:@" Application " inManagedObjectContext:self.coreDataStack.managedObjectContext]; NSFetchRequest * request = [エンティティvalueForKeyPath:@ "propertiesByName.usageMetricsForType.fetchRequest"]; – bandejapaisa

3

ドキュメンテーションでは、フェッチを使用していくつかの属性に基づいて管理対象オブジェクトのセットを見つけ、関係を歩いてすべての関連オブジェクトを見つけ出すことについて話しています。これは、リレーショナルデータベースのデータをどのように見つけるかとはかなり異なるものです。オブジェクトグラフが構築されるときに関係がハードコードされるので、それらを歩くことはフェッチに比べて非常に速く、任意の関係をモデル化することができます。

フェッチされたプロパティを使用して、歩いていることができる管理対象オブジェクトを見つけることはめったにありません。フェッチされたプロパティは、他の永続ストアファイルに格納されているオブジェクトなど、移動できないオブジェクトを見つけるために使用されます。

関係を歩くには、キーパスを使用します。例えば。モデル内の特定の会社のすべての従業員を見つけるには、キーパスteams.employeesを使用し、特定の会社オブジェクトから開始します。開発者を見つけるには、developerという値を保持するRole属性のパスに移動します(例:team.employees.role.roleType)。

特定のケースでは、すべての開発者を含む表が必要な場合は、CompanyエンティティではなくEmployeeエンティティにフェッチを設定します。たとえば、キーパスを持つ述語を使用します。 role.roleType== developer。特定の会社のすべての開発者を望むなら、 `role.roleType == developer AND team.company.name == aCompanyNameのような述語を使用します。

しかし、このようにあなたのモデルを調整することでも良いだろう。

Company<-->>Team<-->>Employee<<-->Role 

今、あなたは、多くの従業員に同じ役割を添付することができRole実体を持っています。これで、roleType== developerという簡単なキーパスでRoleエンティティをフェッチでき、1つのオブジェクトを戻すことができます。 employeesの関係を歩いてRoleにすると、すべての開発者の従業員が得られます。

コアデータで覚えておくべき重要なことは、エンティティとその関係が、あなたのアプリが扱う実際のオブジェクト、イベント、条件をシミュレートすることです。これらの現実のものとそれらの間の関係を可能な限り近づけてデータモデルを設定する必要があります。例えば。現実の世界では、developerは1つの役割に過ぎないため、オブジェクトグラフ内の1つのオブジェクトだけで表現する必要があります。現実世界では、多くの従業員が開発者の役割を果たすことができるので、EmployeesRolesの関係はEmployee<<-->Roleでなければなりません。

あなたのモデルが現実をシミュレートしているほど、アプリケーションはより簡単にすべての点で書くようになります。

+0

もう1つ興味深いのは、これが私が現在どのようにしているのかということです。しかし、私はフェッチされたプロパティを使用する必要があると感じています。主に、私がコアプログラミングガイドで読んだステートメントのために "多くの場合、最初のフェッチはオブジェクトグラフの開始ノードを取得し、その後はフェッチ要求を実行せず、単に関係に従います。また、私のコードはNSFetchRequestsでいっぱいだと感じているので、実際にそこにいる必要はありません。なぜなら、私は1つのルートオブジェクトのプロパティを通してそれらにアクセスできるからです。 – bandejapaisa

+1

roleName == developerの述語を持つRoleにフェッチされたプロパティを追加すると何が問題になるのですか?主にこれにアクセスする簡単な方法として使用するのですか?これはNSFetchRequestを構築するより効率的でしょうか? – bandejapaisa

+0

あなたはこのドキュメントを誤解しています。フェッチするオブジェクトが1つしかないオブジェクトグラフは作成しません。代わりにオブジェクトグラフは、ビーズネックレスの山のようなもので、各ビードはオブジェクトであり、ストリングは関係です。あなたはフェッチを使って各ネックレスのビーズを見つけ、その後、関連するビーズを見つけるために文字列に従ってください。言い換えれば、トータルオブジェクトグラフは、必ずしも互いに接続していない多くの小さなグラフで構成されています。フェッチを使用して、小さなグラフごとに1つのオブジェクトを取得し、リレーションを歩く – TechZen

関連する問題