通过在NSManagedObject的子类中获取相关对象来管理关系是否安全

时间:2013-02-08 06:27:15

标签: cocoa-touch core-data entity-relationship

假设我在核心数据中有员工实体和公司实体。

因此,员工和公司彼此相关:

员工<< --->公司

现在我试图在每个类中修改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.   
  3. 他们有更好的方法来实现吗? (上面的方法背后的想法是 - 我将在每个创建的托管对象上调用上面的方法   它自动管理和映射所有相关的关系)

  4.   

请建议。

1 个答案:

答案 0 :(得分:2)

我明白你要做什么。但不要忘记,Core Data为您提供了对象图,数据库只是次要的实现细节。因此,外键的整个概念是完全没必要的,因为数据库层将为您管理。

但是,唉,我假设您在创建员工时没有Company对象,但只是给了公司ID。当然你可以覆盖NSManagedObject子类,也许最好在id属性的 setter 中:

-(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;
   }
}