2

私はこれをコアデータプログラミングガイドで読みました:

多くの場合、最初のフェッチはオブジェクトグラフの開始ノードを取得し、その後はフェッチリクエストを実行せず、単に関係に従います。

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

しかし、私はこのオブジェクトモデルと関係を持っていると言います

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

最初にフェッチリクエストを使用して会社をロードするとします。次に、一連のチームにアクセスでき、各チームに一連の従業員がいます。

(これはすべて架空のものですが、私のアプリは同じモデルに従います)

'developer'の役割を持つすべての従業員をリストするUITableViewをロードしたいのですが、NSFetchedResultsControllerを使用してこれを実行したいと思います。

すべての「開発者」を返すフェッチされたプロパティをCompanyに作成したいと思います。これは簡単です。

このフェッチされたプロパティをNSFetchedResultsControllerにリンクするにはどうすればよいですか?

4

2 に答える 2

3

ドキュメントが話していることは、フェッチを使用して、いくつかの属性に基づいて一連の管理対象オブジェクトを見つけてから、関係をたどってすべての関連オブジェクトを見つけることです。これは、リレーショナル データベースでデータを検索する方法とは大きく異なります。リレーションシップはオブジェクト グラフの構築時にハードコーディングされるため、それらのウォークはフェッチに比べて非常に高速であり、任意のリレーションシップをモデル化できます。

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

関係をたどるには、キーパスを使用します。たとえば、モデル内の特定の会社のすべての従業員を検索するには、キー パスを使用teams.employeesし、特定の会社オブジェクトから開始します。開発者を見つけるには、次のような値Roleを保持する属性へのパスをたどります。developerteam.employees.role.roleType

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

ただし、次のようにモデルを調整することをお勧めします。

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

これでRole、同じ役割を多くの従業員に割り当てることができるエンティティができました。Roleこれで、単純なキーパスを使用してエンティティを取得できるroleType== developerようになり、1 つのオブジェクトが返されます。employeesの関係を歩くと、Roleすべての開発者の従業員が得られます。

Core Data で覚えておくべき重要なことは、エンティティとその関係は、アプリが扱う現実世界のオブジェクト、イベント、および条件をシミュレートすることを目的としていることです。現実世界のものとそれらの間の関係をできるだけ正確に表現するようにデータ モデルを設定する必要があります。たとえば、現実の世界でdeveloperは、 は 1 つの役割にすぎないため、オブジェクト グラフでは 1 つのオブジェクトだけで表す必要があります。現実の世界では、多くの従業員が開発者の役割を果たすことができるため、 と のEmployees関係RolesEmployee<<-->Role.

モデルが現実をより厳密にシミュレートすればするほど、アプリはあらゆる点で簡単に記述できるようになります。

于 2011-08-17T18:38:14.740 に答える
1

あなたの質問を理解したかどうかはわかりませんが、UITableViewでNSFe​​tchedResultsControllerを使用する場合は、NSFetchRequestを使用する必要があります。関係をたどることはできません。これは、障害を使用することです。

すでにフェッチ要求があるようです。フェッチされたコントローラーで使用するには、そのような要求をNSFetchedResultsControllerに渡す必要があります。

ただし、エンティティの説明とそのプロパティを調べることで、NSFetchedPropertyDescriptionを取得できます。

NSEntityDescription *entityDescription = .....

次に、プロパティを呼び出して、プロパティが見つかるまですべての配列を循環させることができます。

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を持っていないので、コードの有効性をテストすることはできませんが、正しいはずです。

于 2011-08-17T15:30:01.483 に答える