如何仅将具有不同属性的对象添加到核心数据到多个关系NSSet

时间:2013-08-16 19:28:12

标签: ios objective-c core-data

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

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

ShapeInstance实体有三个属性:numSides,edgesLength,color。反向ShapeEntry。

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

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

例如:

  • (三角):3-5-RED
  • (Square):4-5-GREEN
  • (Square):4-10-BLUE
  • (五角大楼):3-10-GREEN

^添加这些形状实例后,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];

...上面的代码呈现了sideCounts,edgeLengths和{3,4,4,3},{5,5,10,10}和{RED,GREEN,BLUE,GREEN}和addObject的颜色方法不会将它们识别为不同。

我可以获取相应的ShapeEntry(这个例子是dumbed down,所以这里只有其中一个存在,但在我的代码中你可能有数千个),遍历每个关系的现有属性并确认值I想要添加尚未存在但是,当我真正想要的是关系从一开始就像NSSet一样行事时,这看起来非常昂贵。我确实认识到,从技术上讲,这种关系正在发挥作用,因为我想要添加的对象是不同的对象'尽管具有相同的属性值,但我希望它更深入一点,并在尝试添加到ShapeEntry关系之前确认这些属性值是不同的。

我该如何完成这项任务?如果我的例子令人困惑,请要求澄清......我在现场做了所以我希望我的变量名称是一致的......

提前致谢!!

1 个答案:

答案 0 :(得分:0)

使用键值编码方法

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

您获得与shapeEntry相关的形状实例的所有颜色值,同样的效果 对于其他属性。这似乎是 比复制所有信息更容易。

如有必要,您仍然可以在colors的瞬态属性中“缓存”ShapeEntry集。