【发布时间】: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