iOS:核心数据:如何在托管对象中保留一组有序的对象

Posted

技术标签:

【中文标题】iOS:核心数据:如何在托管对象中保留一组有序的对象【英文标题】:iOS : Core Data: How to retain an ordered set of objects in a managed object 【发布时间】:2011-03-11 22:10:16 【问题描述】:

我的 ios 应用中有一个 NSManagedObject。该对象称为圆形。在回合中,我与一堆 Person 对象有一对多的关系。

xCode 使用 NSSet 作为我与 Person 托管对象的一对多关系的数据类型来生成我的托管对象类。

所以我的 Round 托管对象看起来像这样:

@interface Round :  NSManagedObject  



@property (nonatomic, retain) NSSet* people;

@end

然而 NSSet 不是一个有序集合,我想保留一个 NSArray 的顺序,我用它来保存这些 Person 对象,因为我将它分配给我的 Round 托管对象。

我尝试将我的 NSArray 转换为 NSSet,但未保留该集合的原始顺序。

我尝试在我的 Round 托管对象中将类型从 NSSet 更改为 NSArray,但在运行时出现以下错误。

2011-03-11 14:00:06.950 SkeetTracker[42782:207] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:**“不可接受的多对关系值类型:属性 =”人们”;所需类型 = NSSet;给定类型 = __NSArrayM;** 值 = (
    " (实体: 人; id: 0x5bed0c0 ; 数据: \n firstName = Todd;\n lastName = McFarlane;\n round = \"0x5bf2cb0 \";\n scores = \"\";\n)",

有没有人遇到过这样的事情并知道解决办法?

亲切的问候, 乔治

【问题讨论】:

【参考方案1】:

我相信 iOS 5 实际上已经内置了它 - 但无论如何,如果您想要 持久 排序顺序,您需要有一个可以创建 NSSortDescription 的存储属性。然后再添加一个返回 [NSSet sortedArrayUsingDescriptors:self.unsortedSetMethod] 数组的方法(我更喜欢只读属性,因此我也可以点访问它)。

【讨论】:

【参考方案2】:

这是一件复杂的事情,我希望 Apple 能够内置它。但既然他们没有,你必须使用一种解决方法。我通常做的是使用未定义类型的瞬态属性,并为数组中的元素添加索引属性。加载数据时,使用按索引排序的对象创建一个数组,它是瞬态属性。保存上下文后,您将遍历数组并确保每个对象都有正确的索引。或者,如果更改很少,您可以在更改数组时更改索引。

【讨论】:

【参考方案3】:

感谢您的好主意。我认为在我的情况下,我可以将“索引”属性添加到我的数组元素(它们也是托管对象)并使索引成为瞬态属性。

我有点不清楚为什么需要创建额外的瞬态数组属性。

【讨论】:

以上是关于iOS:核心数据:如何在托管对象中保留一组有序的对象的主要内容,如果未能解决你的问题,请参考以下文章

使用 Core Data 时,是不是保留非托管对象类及其托管对象版本

Core Data 3 托管对象上下文

具有核心数据托管对象的 URL 方案 (iOS)

核心数据模型 - 实体和逆

如何在核心数据中将非托管对象更改为托管对象

如何快速将核心数据托管对象数组转换为“可识别”列表? (Xcode 11,测试版 5)