我有一个包含(除其他外)WorkingPlan和Position的核心数据数据库。一个WorkingPlan有零个或多个Position对象。一切正常,直到我尝试多次将相同的职位添加到一个工作计划中。而不是拥有多个关系(正如我所需要的那样),我只得到一个关系。我该怎么做才能获得与该职位的多个关系?
2 回答
正如评论中已经提到的,核心数据关系描述了一个对象与一组不同的其他对象的关系。一个对象不可能与同一个其他对象有多个关系。
我想到的一种可能的解决方案是在andWorkingStep
之间引入另一个实体:WorkingPlan
Position
steps
是从到的有序对多关系,WorkingPlan
WorkingStep
plan
是一对一的反比关系,position
WorkingStep
是从到的一对一关系Position
,steps
是逆对多关系。
我建议了从to的有序关系,因为我假设一个计划的步骤必须以定义的顺序执行。WorkingPlan
WorkingStep
例如,如果必须按顺序为计划执行位置“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 生成的访问器中抛出的异常)。使用代理对象是解决该问题的一种方法。
在 xCode Core Data 模型中,将关系“位置”添加到 WorkingPlan。在工作计划对象仍处于选中状态并选中“位置”关系的情况下,在数据模型检查器(在 xCode 右侧)的关系属性表单中,选中“复数”“多对多关系”复选框。如果您需要准确的工作计划相关职位数量,请根据需要填写最小/最大计数字段。