我的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})",
有没有人遇到过这样的事情而且知道解决方案?
亲切的问候, 乔治
答案 0 :(得分:3)
我相信iOS 5实际上已经构建了它 - 但无论如何,如果你想要持久性排序顺序,你需要有一个存储属性,你可以从中创建一个NSSortDescription
。然后你再添加一个方法(我更喜欢readonly属性,所以我也可以点访问它),它返回[NSSet sortedArrayUsingDescriptors:self.unsortedSetMethod]
数组。
答案 1 :(得分:2)
这是一件很复杂的事情,我希望Apple能够构建它。但是既然它们没有,那么你必须使用一种解决方法。我通常做的是使用具有未定义类型的transient属性,并为数组中的元素添加index属性。加载数据时,使用按索引排序的对象创建一个数组,即瞬态属性。保存上下文后,您将遍历数组并确保每个对象都具有正确的索引。或者,如果更改很少,则可以在更改阵列时更改索引。
答案 2 :(得分:0)
这个好主意的Thx。我认为在我的情况下,我可以在我的数组元素中添加一个“index”属性(它们也是托管对象),并使索引成为一个瞬态属性。
我有点不清楚为什么需要创建额外的瞬态数组属性。