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

Ios 如何仅将具有不同属性的对象添加到多关系NSSet的核心数据中,ios,objective-c,core-data,Ios,Objective C,Core Data,假设我有一个核心数据实体ShapeCenter,它包含几个关系: ShapeInstance(对于多个w/ShapeInstance实体) 边计数(对于多个w/String\u容器实体) 边缘长度(多个带字符串的容器实体) 颜色(对于多个w/String\u容器实体) ShapeInstance实体有三个属性:numSides、edgesLength和color。与形状相反 字符串容器实体有一个属性:stringValue。与形状相反 ShapeCenter的目的是包含现有形状的所有实例,以

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

  • ShapeInstance(对于多个w/ShapeInstance实体)
  • 边计数(对于多个w/String\u容器实体)
  • 边缘长度(多个带字符串的容器实体)
  • 颜色(对于多个w/String\u容器实体)
ShapeInstance实体有三个属性:numSides、edgesLength和color。与形状相反

字符串容器实体有一个属性:stringValue。与形状相反

ShapeCenter的目的是包含现有形状的所有实例,以及跟踪每个记录的形状实例使用的不同NUMSIDE、EDGESLENGHTS和颜色

例如:

  • (三角形):3-5-红色
  • (正方形):4-5-绿色
  • (正方形):4-10-蓝色
  • (五角大楼):3-10-绿色
^在添加这些形状实例之后,GameEntry应该包括这四个形状对象中的每一个,并且与边计数、边长度和颜色的NSSet关系应该分别包括{3,4}、{5,10}和{RED,GREEN,BLUE}

但是,由于String_容器是一个对象

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}的边计数、边长度和颜色,addObject方法无法将它们识别为不同的

我可以获取适当的ShapeEntry(这个例子被简化了,所以这里只存在其中的一个,但在我的代码中,您可能有数千个),遍历每个关系的现有属性,并确认我想要添加的值不存在,但如果我真正想要的是让关系从一开始就像NSSet一样运行,那么这似乎非常昂贵。我确实认识到,从技术上讲,关系正在发挥作用,因为我要添加的对象是“不同的对象”,尽管它们具有相同的属性值,但我希望它更深入一步,在尝试添加到ShapeEntry关系之前,确认这些属性值是不同的

我怎样才能完成这项任务?如果我的例子令人困惑,请要求澄清…我是当场编出来的,希望我的变量名是一致的


提前谢谢

使用键值编码方法

NSSet *colors = [shapeEntry valueForKeyPath:@"shapeInstances.color"];
您可以获得与
shapeEntry
相关的形状实例的所有颜色值,同样有效 对于其他属性。这似乎是 比复制所有信息更容易


如果需要,您仍然可以选择“缓存”在
ShapeEntry
的瞬态属性中设置的
颜色。

您可以缓存每个值的托管对象ID(真实数据集中有多少个不同的值)?我想是的…我正在导入32k个不同的“形状”,每个形状可能有2到10个不同的属性,例如“边”、“长度”和“颜色”,等等。这实际上是最简单的方法吗?我能做的不是某种比较器操作吗?让我澄清一下我的形状示例,说也许每个不同的形状都属于名称相似的形状,例如:三角形、正方形、菱形等。因此,对于给定的关系,每个形状都可以有许多属性值。真的有必要复制所有信息吗?使用
[shapeEntry valueForKeyPath:@“shapeInstances.color”]
您将获得一组所有使用过的颜色,与其他属性类似。@Marting R,这是我第一次使用核心数据,因此我不完全了解其功能的深度。我当前的实现或多或少基于我在转换(或在转换)为核心数据之前使用NSDictionary管理数据的方式。如果我没弄错的话,您建议的方法调用将返回某个特定关系的所有属性值的NSSet?那太棒了!我现在就来试试这个……回头再问另一个类似的问题;我一直在四处浏览,试图根据valueForKeyPath方法找到它,但运气不好。如果我想检索某个实体的所有对象的所有关系类型的属性的所有类型的集合,那么需要对上述内容进行哪些更改?我基本上是在寻找我在OP中要求的东西,除了进一步包括实体的所有对象,而不仅仅是实体的一个对象。这是不是:在正确的路径上…使用shapecentry.@shapeInstance.color?不知道如何用正确的语法来写这个。我感谢你的帮助@OneManBand:这需要ShapeEntry实体的
NSFetchRequest
,可能使用
propertiesToFetch
仅获取相关属性。太复杂了,无法发表评论,但也许可以帮助您开始!