1

我有一个包含(除其他外)WorkingPlanPosition的核心数据数据库。一个WorkingPlan有零个或多个Position对象。一切正常,直到我尝试多次将相同的职位添加到一个工作计划中。而不是拥有多个关系(正如我所需要的那样),我只得到一个关系。我该怎么做才能获得与该职位的多个关系?

4

2 回答 2

5

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

我想到的一种可能的解决方案是在andWorkingStep之间引入另一个实体:WorkingPlanPosition

在此处输入图像描述

  • steps是从到的有序对多关系,WorkingPlanWorkingStep
  • plan是一对一的反比关系,
  • positionWorkingStep是从到的一对一关系Position
  • steps是逆对多关系。

我建议了从to的有序关系,因为我假设一个计划的步骤必须以定义的顺序执行。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

这似乎是其他人已经注意到的自动生成的访问器方法中的一个错误(例如NSOrderedSet 生成的访问器中抛出的异常)。使用代理对象是解决该问题的一种方法。

于 2013-01-11T21:27:04.380 回答
0

在 xCode Core Data 模型中,将关系“位置”添加到 WorkingPlan。在工作计划对象仍处于选中状态并选中“位置”关系的情况下,在数据模型检查器(在 xCode 右侧)的关系属性表单中,选中“复数”“多对多关系”复选框。如果您需要准确的工作计划相关职位数量,请根据需要填写最小/最大计数字段。

于 2013-01-11T17:55:06.357 回答