核心数据:在多对多关系中,我应该使用什么作为有序集(ios5)的排序描述符

核心数据:在多对多关系中,我应该使用什么作为有序集(ios5)的排序描述符,ios,core-data,nspredicate,Ios,Core Data,Nspredicate,-我有一个项目实体和一个标记实体。 -项目可以有多个标记,并且标记可以链接到多个项目(多对多关系)。 -这种关系是一种“有序关系”(在IOS5中使用有序关系) 我想获取给定项目的所有子标记 Im使用以下提取请求: NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Item"]; // Fetch all items that have a given tag Tag* myTag = ....; req

-我有一个
项目
实体和一个
标记
实体。 -项目可以有多个标记,并且标记可以链接到多个项目(多对多关系)。 -这种关系是一种“有序关系”(在IOS5中使用有序关系)

我想获取给定项目的所有子标记

Im使用以下提取请求:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"Item"];

// Fetch all items that have a given tag
Tag* myTag = ....;
request.predicate = [NSPredicate predicateWithFormat:@"ANY tag == %@", myTag];

// This is my attempt to get the correct sort ordering (it crashes)
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"tag"
                                                                 ascending:YES];
request.sortDescriptors = @[sortDescriptor];
上面的排序描述符返回数据(我假设是以某种顺序),但随后崩溃:

[_NSFaultingMutableOrderedSet compare:]: unrecognized selector sent to instance 0x10b058f0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'-[_NSFaultingMutableOrderedSet compare:]: unrecognised selector sent to instance 0x10b058f0'
如果我给出了一个空的排序描述符数组,那么我不会得到崩溃,但是结果不是有序的


如何使用ios5中的有序关系功能在多对多关系中正确实现排序描述符?

我认为您可能误解了有序关系在核心数据中的含义。正如所说,“有序”并不意味着“关于某个属性”,相反,“有序”意味着“保留用户的顺序”(或者其他看起来随意的特定顺序)。一些例子:

  • 一个有序的关系对于配方中的步骤是很好的(苹果的例子)——这些步骤不一定是根据它们的任何属性(例如它们的文本)来排序的,如果核心数据没有进行排序,它们必须自己维护一个“索引”或“顺序”属性
  • 有序关系不适合于名称列表——例如,用户可以选择按名字或姓氏排序,并且名称集合在内部没有真正的内在顺序。唯一重要的是显示顺序——数据本身不需要保持这种顺序。(苹果文档中的经验法则是,如果用户可以在排序说明符之间进行选择,那么这种关系不应该在核心数据中排序。)
在本例中,您尝试将排序描述符应用于正在获取的有序集集集(标记的值)。这就是导致崩溃的原因-SensorDeredSet子类(
\n在您的情况下,FaultingMutableOrderedSet
)没有实现排序描述符将用于排序它们的
-compare:
方法,因此会出现该异常

我认为一个很好的解决方案是根本不使用排序描述符;相反,如果您想更改显示给用户的保留顺序,请获取某个项目的
标记
的SensorDeredSet值,然后使用自己的排序从中获取一个数组。这将使数据在核心数据中保持正确的顺序,但允许您自己以编程方式重新排序


在更高的层次上,你可能还想考虑你是否真的需要你的关系中的秩序。它会导致显著的性能损失,而您真正得到的只是将标记添加到项目中的原始顺序(反之亦然)。如果您打算在每次显示标记时更改顺序,那么您在性能上受到的影响并没有真正的好处-使您的关系无序,然后继续以编程方式排序,或者在聚合键上使用排序描述符,例如
标记。@count
,正如评论中所建议的。

您能否澄清您正在获取的实例是什么实体?如果您正在获取
的实例,那么排序描述符将确定
的排序顺序,并且与排序关系无关
必须
标记
。导致此异常的原因是您的密钥路径不是以属性结束,而是以集合结束。试试
标记。@count
例如,我有一个类似的查询。在本例中,我将查找与标记关联的所有项目(项目实体上的获取请求),并且由于标记与项目之间是一种有序关系,因此我希望按照保存在数据库中的顺序获取与标记链接的项目。Coredata不公开用于维护有序关系的中间表,因此如何在NSFetchedResultsController中指定该中间表?我正在尝试按保存顺序获取链接到标记intance的所有项目实例。我将sql查询打印到控制台,如果我使用标记作为排序描述符,我可以看到结果是由中间表排序的,但是这是核心数据的内部数据。是否仍然可以使用排序描述符指定此顺序?从ZKDITEM t0中选择不同的0,t0.Z_PK,在t0.Z_PK=t1.Z_2项上加入Z_2TAGS t1,其中t1.Z_4TAGS=?按t1.Z_FOK_2item订购您可以再描述一下您希望它如何排序吗?它以前崩溃过,因为“键”不是属性,而是关系。