首页 文章

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

提问于
浏览
4

我的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 回答

  • 3

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

  • 2

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

  • 0

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

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

相关问题