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 回答