我在Lion上的XCode 4.1中创建了一个具有1-many关系的简单数据模型。
为此关系生成的属性类型是NSOrderedSet,由于类型未知,因此无法编译。
我搜索了文档,了解这是为Mac OS 10.7(Lion)添加的一种新的集合类,在托管对象中特别有用(我只是习惯了Apple的工作方式:像基本的一样语言中的集合类型绑定到OS发布...有趣的)
这是有道理的,NdOrderedSet显然是NSSet和NSArray的特性的组合 - 也就是说,它具有像数组一样的索引顺序,每个元素都像集合一样唯一。尼斯。但是,我的问题是:
为什么XCode会生成无法编译的内容?
我自己会在#1上采取行动:我的SDK是iOS 4.3,早于Lion(并非Mac OS而是iOS),并且根本没有这个新的集合类。 好吧,公平,但#2代表:为什么XCode会为我生成它?为什么不检测我的SDK并生成有效的东西?为什么不给我一个选择?
这将我带到#3和#4
解决方法是什么?我应该将其更改为NSSet或NSArray吗? XCode是如何在4.0之前生成这些东西的?
如果我使用NSOrderedSet(即以某种方式让它工作)它会向后兼容以前的iOS版本吗?
答案 0 :(得分:1)
核心数据有序关系仅适用于iOS 5,而不适用于iOS 4.3。 您需要iOS 5 SDK,它仅适用于Xcode 4.2。从Xcode 4.1切换到Xcode 4.2,你应该没问题。
3:解决方法是使用Xcode 4.2并定位iOS 5.如果您仍想要定位iOS 4.x并订购关系,请继续阅读。
4:你不太可能让NSOrderedSet在iOS 4.3中运行。 Cocoa Touch完全没有上课。所以你需要从头开始重新实现它,这绝对是可行的。 不可行的是,然后让Core Data使用它。所以忘了它。
现在,值得一提的是 可以定义与“旧”核心数据的有序关系。它需要更多的工作,但它绝对可行。这是一个例子:
想象一下Meal
和Course
个实体。一顿饭与课程有着有序的关系,因为用餐期间的课程按特定顺序出现。你不想在主菜之前吃甜点!
这个想法是定义一个第三个帮助实体,代表餐中的课程成员资格。我们称之为实体CourseInMeal
。现在设置以下关系:
Course <--------->> CourseInMeal <<----------> Meal
双箭头表示关系的“对多”结束。
这些关系基本上表示课程可以在几餐中出现,而且一顿饭可以有几道菜。
唯一剩下的就是代表有序关系。为此,只需向CourseInMeal
实体添加一个属性,可能称为position
。
现在,当您想要定义一顿新餐时,您可以为用餐中的每个课程创建一个CourseInMeal
的新实例,其中包括:
CourseInMeal *newMealMembership = [CourseInMeal insertInManagedObjectContext:self.moc];
newMealMembership.course = myDessert;
newMealMembership.meal = myBirthdayMeal;
newMealMembership.position = 3; // or whatever
[self.moc save:NULL];
Voilà,你在普通的核心数据中有一个有序的关系。
答案 1 :(得分:0)
我刚试了一下。我的结果是NSSet
,而不是NSOrderedSet
。
也许您应该检查项目设置,特别是标题体系结构下的项目。 (选择项目,构建设置,体系结构和基础SDK ,以及支持的平台)。