0

会社と従業員の 2 つのモデルがあるとします。会社には多くの従業員がいて、従業員は会社に所属しています。

レールでは、単純なものがあります:

class Company < ActiveRecord::Base
  has_many :employees
end
class Employee < ActiveRecord::Base
  belongs_to :company
end

次のようなクエリを実行できます。

Employee.where(company_id: 1)

それでは、Core Data でこれを行う方法を見てみましょう。Company と Employee という 2 つのエンティティを作成しました。それぞれに NSManagedObject suclasses を生成しましたが、特定の会社の従業員を返す単純な再利用可能なクエリを実行したいと考えています。

まず、Employee+queries というカテゴリを作成しました。Employee+queries.h には、次のものがあります。

@interface Employee (queries)
  + (NSArray *)whereCompanyIDis:(int)companyID;
@end

Employee+queries.m には、次のものがあります。

@implementation Employee (queries)
  + (NSArray *)whereCompanyIDis:(int)companyID {
    NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Company"];
    request.predicate =[NSPredicate predicateWithFormat:@"id = %d", companyID];
    NSError *error;
    NSArray *companies = [context executeFetchRequest:request error:&error];
    Company *company = [companies objectAtIndex:0];
    return [company.employees allObjects];
  }
@end

私は次のことを行います:

  • NSManagedObjectcontext を取得する
  • 会社のリクエストを作成する
  • クエリを実行します
  • 結果の最初の要素を取得します (会社ごとに一意の ID があるため、1 つしかありません)
  • company.employees は NSSet なので、TableViewController で使用できる NSArray に変換します

今、必要なコントローラーで、次のことができます。

NSArray *employees = [Employee whereCompanyIDis: 1]

会社IDを指定して会社の従業員の配列を取得するだけで、私がやろうとしていることは非常に複雑に思えます。

そのコードをどのようにリファクタリング/再編成しますか? ここで完全に欠けているベストプラクティスはありますか?

どうもありがとう、ニコラス

4

1 に答える 1

1

原則として、管理対象オブジェクトではなく、「会社 ID」しかない場合は、これが正しい方法です。ただし、従業員を直接フェッチすることで、リクエストを簡素化します。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
request.predicate =[NSPredicate predicateWithFormat:@"company.id = %d", companyID];
NSError *error;
NSArray *employees = [context executeFetchRequest:request error:&error];

従業員をテーブル ビューNSFetchedResultsControllerで表示する場合は、 (上記のフェッチ リクエストで)を使用することも検討する必要があります。フェッチされた結果コントローラーは、オブジェクトが挿入、削除、または変更された場合にテーブル ビューを自動的に更新できます。

于 2013-09-13T05:09:45.440 に答える