【发布时间】: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?这将是惊人的!我现在就试试这个...
标签: ios objective-c core-data