我有一个核心数据数据库,其中包含 WorkingPlan 和 Position 。 WorkingPlan 具有零个或多个 Position 对象。 一切正常,直到我尝试将相同的位置添加到一个 WorkingPlan 多次。而不是有多个关系(我需要它),我只得到一个关系。我可以做些什么来获得与位置的多个关系?
答案 0 :(得分:5)
正如评论中已经提到的,核心数据关系描述了一个对象与一组不同其他对象的关系。一个对象不可能与同一个其他对象具有多个关系。
我想到的一个可能的解决方案是在WorkingStep
和WorkingPlan
之间引入另一个实体Position
:
steps
是从WorkingPlan
到WorkingStep
的有序对多关系,plan
是一对一的关系,position
是从WorkingStep
到Position
的一对一关系,steps
是反多种关系。我建议从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
这似乎是自动生成的访问器方法中的一个错误,已经被其他人注意到了(例如Exception thrown in NSOrderedSet generated accessors)。使用代理对象是解决该问题的一种方法。
答案 1 :(得分:0)
在xCode Core Data模型中添加一个关系,“position”到WorkingPlan。在仍然选择工作计划对象并选择“位置”关系的情况下,在数据模型检查器的关系属性表单中(在xCode的右侧)选择“复数”“多对多关系”复选框。如果您需要具有与workingPlan相关的精确位置数,请根据需要填写最小/最大计数字段。