【问题标题】:Core Data To-Many Relationship Creating Duplicates When Adding Object to Parent Entity将对象添加到父实体时创建重复的核心数据对多关系
【发布时间】:2013-09-04 07:13:22
【问题描述】:

我是 Core Data 和 Objective-c 的新手。我正在从事一个项目,我从 Web 服务获取 JSON 数据并将其与核心数据同步。 我成功地关注了这个tutorial,并且能够毫无问题地将 JSON 转换为核心数据。 我遇到问题的地方是更新与一对多关系关联的 NSSet。到目前为止,我可以让它更新,但这样做会在集合中创建重复的条目。例如,我尝试在我的自定义 ManagedObject Entity1 中使用 Xcode 生成的访问方法:

Entity1<-->>Entity2<-->>Entity3

我使用此代码将 Entity2 对象添加到 Entity1

    NSNumber *parentIdNumber = [record valueForKey:@"parent_id"];
    NSArray *parentIdArray = [NSArray arrayWithObject:parentIdNumber];
    NSArray *parentEntityArray = [self managedObjectsForClass:@"Entity1" sortedByKey:@"id" usingArrayOfIds:parentIdArray inArrayOfIds:YES];
    Entity1 *parentEntity = [parentEntityArray lastObject];
    [parentEntity addEntity2Object:(Entity2 *)newManagedObject];

在运行时查看每个变量后,我确定一切正常,直到最后一行。当我将 Entity2 添加到 Entity1 时,它实际上添加了对象。但是,当我尝试添加 3 个不同的 Entity2 对象时,它似乎在 Entity1 中创建了 3 个重复的 Entity2 对象。 3 个副本是添加的 Entity2 的最后一个实例。

我也尝试过使用这个答案中的方法:https://stackoverflow.com/a/5370758/2670912。看起来像这样:

    NSNumber *parentIdNumber = [record valueForKey:@"parent_id"];
    NSArray *parentIdArray = [NSArray arrayWithObject:parentIdNumber];
    NSArray *parentEntityArray = [self managedObjectsForClass:@"Entity1" sortedByKey:@"id" usingArrayOfIds:parentIdArray inArrayOfIds:YES];
    Entity1 *parentEntity = [parentEntityArray lastObject];
    NSMutableSet *entity2Set = [parentEntity mutableSetValueForKey:@"entity2"];
    [entity2Set addObject:newManagedObject];

这具有相同的重复条目结果,除了我没有获得添加的第三个对象的 3 个重复条目,而是获得了添加的第一个对象的 3 个重复条目。

有人知道是什么原因造成的吗?

【问题讨论】:

  • 如何创建newManagedObject? “重复对象”到底是什么意思? (一对多关系存储为 NSSet,不能包含两次相同的对象。)
  • 我正在使用NSManagedObject *newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:className inManagedObjectContext:self.managedObjectContext];,它似乎工作正常。
  • 那么在什么意义上存在“重复对象”? - (顺便说一句。将对象添加到一对多关系的一种稍微简单的方法是使用反向关系,例如newManagedObject.parent = parentEntity;。但您的代码也应该可以工作。)
  • 我创建了一个由 entity1.entity2 填充的虚拟“NSSet”对象。你是对的,没有重复。我显示数据的方式一定有问题。另外,感谢@MartinR 的提示。这看起来是一种更清洁的方式。

标签: ios core-data one-to-many relationships


【解决方案1】:

我使用的代码片段结果证明工作正常。问题是当我在UITableView 中显示数据时,它正确地绘制了NSSet 中的实体数量,从而显示了正确的单元格数量。但是,我有一个代码:

    NSSet *entitiesSet = [self.selectedEntity1 valueForKey:@"entity2"];
    NSArray *entities = [entitiesSet allObjects];
    Entity2 *entity = [entities objectAtIndex:[indexPath indexAtPosition:0]];

这会导致单元格仅显示NSSet 中的最后一个对象,使其看起来像重复项。我通过将0 更改为1 来解决问题,如下所示:

    Entity2 *entity = [entities objectAtIndex:[indexPath indexAtPosition:1]];

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多