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

Posted

技术标签:

【中文标题】如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet【英文标题】:How to Only Add Objects with Distinct Attributes to Core Data to-many Relationship NSSet 【发布时间】:2013-08-16 19:28:12 【问题描述】:

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

shapeInstances(带 ShapeInstance 实体的多对多) sideCounts(对许多 w/ String_Container 实体) edgeLengths(对许多 w/ String_Container 实体) 颜色(对许多 w/ String_Container 实体)

ShapeInstance 实体具有三个属性:numSides、edgesLength、color。与 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 ,蓝色,分别。

但是,因为 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 和 addObject 的 sideCounts、edgeLengths 和颜色方法不会将它们识别为不同的。

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

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

提前致谢!!

【问题讨论】:

您能否缓存每个值的托管对象 ID(您的真实数据集中有多少不同的值)? 我猜是这样......我正在导入 32k 个不同的“形状”,每个 shapeEntity 可能有 2 到 10 个不同的属性,用于“边”、“长度”和“颜色”等等等。这实际上是最简单的方法吗?我不能做某种比较器操作吗? 让我澄清一下我的形状示例,也许每个不同的 shapeEntity 都属于类似名称的形状,即:三角形、正方形、菱形等。因此,对于给定的关系,每个形状都可以有许多属性值. 真的有必要复制所有信息吗?使用[shapeEntry valueForKeyPath:@"shapeInstances.color"],您将获得一组所有使用过的颜色,与其他属性类似。 @Marting R,这是我第一次使用 Core Data,所以我并不完全了解它的功能深度。我当前的实现或多或少基于我在转换(或正在转换)核心数据之前使用 NSDictionary 管理数据的方式。如果我理解正确,您建议的方法调用将返回某个特定关系的所有属性值的 NSSet?这将是惊人的!我现在就试试这个... 【参考方案1】:

使用键值编码方式

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

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

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

【讨论】:

返回另一个类似的问题;一直在浏览试图根据 valueForKeyPath 方法找到它,但没有运气。如果我想检索某个实体的所有对象的所有某种类型关系的所有类型属性的集合,那么需要对上述内容进行哪些更改?我基本上是在寻找我在 OP 中要求的内容,除了进一步包括实体的所有对象,而不仅仅是实体的一个对象。 这是:<Key Value Coding> 在正确的路径上...使用shapesEntry.@shapeInstance.color?不知道如何用正确的语法写这个。感谢您的帮助! @OneManBand:这需要一个 NSFetchRequest 用于 ShapeEntry 实体,可能使用 propertiesToFetch 仅获取相关属性。评论太复杂了,但也许可以帮助您开始!

以上是关于如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet的主要内容,如果未能解决你的问题,请参考以下文章

如何在不复制目标 NSManagedObject 的情况下将目标 NSManagedObject 添加到另一个具有反向多对多核心数据关系的对象?

将对象添加到具有多对多关系的核心数据中的 NSSet

如何添加和查看核心模型关系的数据

Restkit + Coredata - 仅将唯一对象添加到一对多关系中

核心数据关系可以有多个目的地吗?

核心数据 - 具有一对多关系的实体正在检索除“关系”实体之外的所有实体对象的属性