0

コア データに従業員エンティティと会社エンティティがあるとします。

したがって、従業員と会社は次のように関連付けられています。

従業員 <<---> 会社

今、私は次のように、各クラスで manageRelationships メソッドを正しくしようとしています:

@interface Employee : NSManagedObject
- (void)manageRelationships;
@property (nonatomic, retain) Company *company; // for relationship
@property (nonatomic, retain) NSNumber *companyId; // acts as foreign key 
@end

@implementation Employee
@dynamic company;
@dynamic companyId;
- (void)manageRelationships
{
   // prepare a predicate as @"companyId == %@",self.companyId

   // execute a fetch request against Company entity

   // map relationship using self.company = retrievedCompanyObject
}

今、いくつか質問があります:

  1. NSManagedObject のサブクラス内で、上記で実装したように、フェッチ要求を起動して関係をマップしても安全ですか?

  2. それを達成するためのより良い方法はありますか?(上記のアプローチの背後にあるアイデアは、関連するすべての関係を自動的に管理およびマップするように、作成された管理対象オブジェクトごとに上記のメソッドを呼び出すことです)

提案してください。

4

1 に答える 1

2

私はあなたがやろうとしていることを見ます。ただし、Core Data はオブジェクト グラフを提供することを忘れないでください。データベースは二次的な実装の詳細にすぎません。したがって、データベース層がそれを管理するため、外部キーの概念全体は完全に不要です。

しかし残念ながらCompany、従業員を作成するときにオブジェクトを持っていないだけで、会社の ID が与えられているだけだと思います。もちろん、NSManagedObjectサブクラスをオーバーライドできます。おそらくid プロパティのセッターが最適です。

-(void)setCompanyId:(NSNumber*)newId {
   self.companyId = newId;
   if (!newId) { self.company = nil; }
   else {
      Company *myCompany = ... // fetch company
      self.company = myCompany;
   }
}

ただし、これが冗長であることがわかります。エンティティに外部キーを保持する必要はありません。いつでも取得できます

NSNumber *companyId = employee.company.id;

そのため、簡単に会社を追加するメソッドをEmployeeクラスに追加するだけの方がよい場合があります。

-(void)addCompanyWithId:(NSNumber*)companyID {
   if (!companyID) { self.company = nil; }
   else {
      Company *employer = ...// fetch company
      self.company = employer ? employer : nil;
   }
}
于 2013-02-08T08:24:54.617 に答える