核心数据:与同一对象的多重关系

时间:2013-01-11 16:26:27

标签: ios core-data relationship

我有一个核心数据数据库,其中包含 WorkingPlan Position WorkingPlan 具有零个或多个 Position 对象。 一切正常,直到我尝试将相同的位置添加到一个 WorkingPlan 多次。而不是有多个关系(我需要它),我只得到一个关系。我可以做些什么来获得与位置的多个关系?

2 个答案:

答案 0 :(得分:5)

正如评论中已经提到的,核心数据关系描述了一个对象与一组不同其他对象的关系。一个对象不可能与同一个其他对象具有多个关系。

我想到的一个可能的解决方案是在WorkingStepWorkingPlan之间引入另一个实体Position

enter image description here

  • steps是从WorkingPlanWorkingStep有序对多关系,
  • plan是一对一的关系,
  • position是从WorkingStepPosition的一对一关系,
  • steps是反多种关系。

我建议从WorkingPlanWorkingStep建立有序关系,因为我认为必须按照定义的顺序执行一个计划的步骤。

例如,如果必须按照该顺序对计划执行“pos1”,“pos2”,“pos1”位置,则需要在计划中添加3个步骤“step1”,“step2”,“step3” ,“step1”和“step3”都与“pos1”有关,“step2”与“pos2”有关。

向有序关系添加值有点棘手。以下代码显示了如何创建上述对象:

WorkingPlan *plan1 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingPlan" inManagedObjectContext:context];

WorkingStep *step1 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingStep" inManagedObjectContext:context];
WorkingStep *step2 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingStep" inManagedObjectContext:context];
WorkingStep *step3 = [NSEntityDescription insertNewObjectForEntityForName:@"WorkingStep" inManagedObjectContext:context];

Position *pos1 = [NSEntityDescription insertNewObjectForEntityForName:@"Position" inManagedObjectContext:context];
Position *pos2 = [NSEntityDescription insertNewObjectForEntityForName:@"Position" inManagedObjectContext:context];

step1.position = pos1;
step2.position = pos2;
step3.position = pos1;

// temporary proxy object used to modify the ordered to-many relationship "steps":
NSMutableOrderedSet *tmpMutableSteps = [plan1 mutableOrderedSetValueForKey:@"steps"];
[tmpMutableSteps addObject:step1];
[tmpMutableSteps addObject:step2];
[tmpMutableSteps addObject:step3];

更多信息:

你也可以在一个“步骤”中设置plan1.steps,如下所示:

plan1.steps = [NSOrderedSet orderedSetWithObjects:step1, step2, step3, nil]; // works!

但是一些存取方法不适用于有序关系:

[plan1 addStepsObject:step1]; // does not work!

似乎是“合乎逻辑的步骤”,但它会引发NSInvalidArgumentException

*** -[NSSet intersectsSet:]: set argument is not an NSSet

这似乎是自动生成的访问器方法中的一个错误,已经被其他人注意到了(例如Exception thrown in NSOrderedSet generated accessors)。使用代理对象是解决该问题的一种方法。

答案 1 :(得分:0)

在xCode Core Data模型中添加一个关系,“position”到WorkingPlan。在仍然选择工作计划对象并选择“位置”关系的情况下,在数据模型检查器的关系属性表单中(在xCode的右侧)选择“复数”“多对多关系”复选框。如果您需要具有与workingPlan相关的精确位置数,请根据需要填写最小/最大计数字段。