gpt4 book ai didi

ios - 核心数据:到同一对象的多个关系

转载 作者:行者123 更新时间:2023-12-01 17:57:48 26 4
gpt4 key购买 nike

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

最佳答案

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

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

  • 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)注意到。使用代理对象是解决该问题的方法。

    关于ios - 核心数据:到同一对象的多个关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282386/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com