cLa*_*Lar 1 core-data relationship ios
我有一个核心数据数据库,其中包含(其中包括)WorkingPlan和Position.一个WorkingPlan具有零米或多个位置的物体.一切正常,直到我试图多次向一个WorkingPlan添加相同的位置.而不是有多个关系(我需要它),我只得到一个关系.如何获得与该职位的多重关系?
正如评论中已经提到的,核心数据关系描述了一个对象与一组不同的其他对象的关系.一个对象不可能与同一个其他对象具有多个关系.
我想到的一个可能的解决方案是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];
Run Code Online (Sandbox Code Playgroud)
更多信息:
你也可以plan1.steps像这样设置一个"步骤":
plan1.steps = [NSOrderedSet orderedSetWithObjects:step1, step2, step3, nil]; // works!
Run Code Online (Sandbox Code Playgroud)
但是一些存取方法不适用于有序关系:
[plan1 addStepsObject:step1]; // does not work!
Run Code Online (Sandbox Code Playgroud)
似乎是"合乎逻辑的一步",但它抛出了NSInvalidArgumentException:
*** -[NSSet intersectsSet:]: set argument is not an NSSet
Run Code Online (Sandbox Code Playgroud)
这似乎是自动生成的访问器方法中的一个错误,已经被其他人注意到了(例如,在NSOrderedSet生成的访问器中抛出了异常).使用代理对象是解决该问题的方法.
| 归档时间: |
|
| 查看次数: |
1571 次 |
| 最近记录: |