核心数据:如何在维护公共属性的同时动态更改对象的实体

时间:2011-03-07 11:35:50

标签: objective-c cocoa core-data

假设您拥有经典的经理< - Department(s) - >>员工数据模型。 Manager从继承自Person实体的Employee实体继承的地方。

如果我有一个部门,一个经理和一组员工,我怎样才能以编程方式代表经理失去工作并被降级为一个员工,其中一个员工被提升为经理?

在核心数据的说法中,我想采用一个托管对象并更改其实体,尽管将其保留为Person的子类。有一种聪明的方法吗?或者我是否必须编写方法来推广员工并将管理员降级为:

+ (Employee *)demoteManager:(Manager *)manager {

  // Get the context
  NSManagedObjectContext *context = [manager managedObjectContext];

  // Create a new employee object (mogenerator style)
  Employee *employee = [Employee insertIntoManageObjectContext:context];

  // Set attributes etc
  employee.name = self.name; 

  // Set relationships etc
  Department *dept = manager.manages;
  [dept addEmployeesObject:employee];
  employee.department = dept;
  dept.manager = nil;
  manager.manages = nil;

  // Delete manager
  [context deleteObject:manager];

  // Save
  NSError *error = nil;
  [context save:&error];

  return employee;
}

等?我意识到我应该在Employee(isManager)上放置一个布尔标志,但这是一个人为的例子,实际上我不想使用标志。

所以,如果某些核心数据向导已经这样做或者知道更好的方式,我很乐意听到!

干杯,

2 个答案:

答案 0 :(得分:2)

无法像您所描述的那样更改实体。您需要创建一个新员工,将经理的数据复制到该员工记录,并为升职员工创建一个新经理。

然而,正如克里斯蒂安所说,如果你的经理也是一名雇员,那会更好。您提到了特定于管理器的其他数据。也许你可以把它放到与特定员工有关系的第三个表中。然后,任何也是经理的员工都会将数据存储在此辅助表中。比破坏和创造物品只是为了促进或降低经理人的痛苦要小得多。

答案 1 :(得分:1)

您无法更改核心数据AFAIK中的实体类型。

ManagerEmployee之间有什么区别? Manager还不是Employee吗?不是Manager Employee,角色为Manager

根据我的理解,我会像这样建模:

部门 - >>员工

Department的属性managerEmployee的关系为1:1,定义了哪位员工是经理。