0

假设我有一个核心数据实体 ShapesEntry,其中包含几个关系:

  • shapeInstances (to-many w/ ShapeInstance Entity)
  • sideCounts(对许多 w/ String_Container 实体)
  • edgeLengths(对许多 w/ String_Container 实体)
  • 颜色(对于许多 w/ String_Container 实体)

ShapeInstance 实体具有三个属性:numSides、edgesLength、颜色。与 ShapeEntry 相反。

String_Container 实体有一个属性:stringValue。与 ShapeEntry 相反。

ShapesEntry 的目的是包含现有形状的所有实例,并跟踪每个记录的形状实例使用的不同 numSides、edgeLengths 和颜色。

例如:

  • (三角形):3-5-RED
  • (方形):4-5-绿色
  • (方形):4-10-蓝色
  • (五角大楼):3-10-绿色

^ 添加这些形状实例后,GameEntry 应包括这四个 Shape 对象中的每一个,并且与 sideCounts、edgeLengths 和颜色的 NSSet 关系应包括 {3, 4}、{5, 10} 和 {RED, GREEN, BLUE} , 分别。

但是,因为 String_Container 是一个对象...

String_Container *sides = [NSEntity Description insertNewObjectForEntityForName:@"String_Container" inManagedObjectContext:context];
sides.stringValue = shapeInstance.numSides; //or edgesLength or color
[shapeEntry addSideCounts:sides];

...上面的代码渲染了 {3, 4, 4, 3}, {5, 5, 10, 10} 和 {RED, GREEN, BLUE, GREEN} 的 sideCounts、edgeLengths 和颜色,而 addObject 方法没有将它们识别为不同的。

我可以获取适当的 ShapeEntry(此示例已简化,因此此处仅存在其中 1 个,但在我的代码中可能有数千个),遍历每个关系的现有属性并确认我要添加的值尚不存在,但当我真正想要的是让关系从一开始就表现得像 NSSet 时,这似乎非常昂贵。我确实认识到从技术上讲这种关系正在发挥作用,因为我要添加的对象是“不同的对象”,尽管具有相同的属性值,但我希望它更深入并确认这些属性值在尝试之前是不同的添加到 ShapeEntry 关系。

我怎样才能完成这项任务?如果我的示例令人困惑,请要求澄清......我当场制作了它,所以希望我的变量名是一致的......

提前致谢!!

4

1 回答 1

0

使用键值编码方法

NSSet *colors = [shapeEntry valueForKeyPath:@"shapeInstances.color"];

您将获得与 相关的形状实例的所有颜色值,shapeEntry其他属性也一样。这似乎比复制所有信息更容易。

如果需要,您仍然可以选择colors在瞬态属性中“缓存”该集合ShapeEntry

于 2013-08-16T20:14:14.517 回答