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

时间:2011-03-11 22:10:17

标签: ios core-data nsmanagedobject

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

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

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

@interface Round :  NSManagedObject  
{
}

@property (nonatomic, retain) NSSet* people;

@end

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

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

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

2011-03-11 14:00:06.950 SkeetTracker[42782:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: **'Unacceptable type of value for to-many relationship: property = "people"; desired type = NSSet; given type = __NSArrayM;** value = (
    " (entity: Person; id: 0x5bed0c0  ; data: {\n    firstName = Todd;\n    lastName = McFarlane;\n    round = \"0x5bf2cb0 \";\n    scores = \"\";\n})",

有没有人遇到过这样的事情而且知道解决方案?

亲切的问候, 乔治

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

这个好主意的Thx。我认为在我的情况下,我可以在我的数组元素中添加一个“index”属性(它们也是托管对象),并使索引成为一个瞬态属性。

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