2011-02-06 127 views
12

我正在写一个iOS应用程序,它具有人员记录存储,并需要显示列出他们以特定方式排序。这些排序的数量是可变的,并且它们是即时生成的,但我希望它们存储在数据存储中。执行此操作的SQL方法是使ListPositions表具有列表名称,个人表中的id以及排序键。然后,要显示一个特定的列表,我可以选择带有给定名称的所有列表ListPositions,拉入引用的人员,并对排序键进行排序。试图在CoreDatat中做到这一点,但我遇到了问题。我试图做到这一点使用的模式,如:核心数据排序对多关系

Person: 
    Name 
    DOB 
    etc... 
    positions -->> ListPosition 

ListPosition: 
    listName 
    sortKey 
    person --> Person 

然后,我可以得到所有在给定列表中的人与NSPredicate [NSPredicate predicateWithFormat:@"ANY positions.listName like %@", someList]; 这使我动态地添加列表针对一大组人的。问题是我无法使用ListPosition的sortKey字段对人员进行排序。 NSSortDescriptor会做什么?如果无法对一对多关系的一个元素的属性进行排序,那么在coredata中获得多个动态排序的另一种方法是什么?我用NSFetchedResultsController显示列表,所以我不能把列表放在一起。我需要用一个NSFetchRequest来完成它。

+0

一些更好的格式化会让阅读你的问题变得更容易。 – vikingosegundo 2011-02-06 20:46:48

+0

给我们你的代码! – vikingosegundo 2011-02-06 21:17:45

回答

3

你是对的 - 遵循一对多的关系返回一个NSSet,它没有固有的排序。要获得排序结果,有几个选项:

  1. 假设Person/ListPosition是双向关系,请为ListPosition实体执行新的获取请求。在来自ListPosition的“人”关系上进行谓词匹配,看起来像[NSPredicate predicateWithFormat:@"person=%@", myPerson]。在获取请求上使用您需要的任何排序描述符。
  2. 按照你所做的关系,给你一个NSSet。然后使用NSSet的-sortedArrayUsingDescriptors:方法将其转换为排序数组。
+0

我不清楚。我的问题不是如何在一对多关系中对对象进行排序,而是如何为大量对象提供许多不同的排序顺序。我编辑了这个问题。 – wombat57 2011-02-06 23:03:08

1

我认为在这种情况下最好的方法是在ListPosition实体上取而代之。为sortKey添加排序描述符(在这种情况下它将起作用,因为获取请求位于ListPosition实体上),并使用setRelationshipKeyPathsForPrefetching为获取请求上的“person”预取与列表名称关联的Person。

[NSPredicate predicateWithFormat:@"listName like %@", someList]; 
1

如果我正确理解你的模型中,每个Person对每个它所参与列表中的一个ListPosition。假设我们有他们的名字的列表,所以X人有X列表职位相同listNamesortKey

我将创建实体List,它将包含sortKey属性,然后在排序描述符中使用它。

entity List: 
    - sortKey : string 
    - ascending : bool 

创建排序描述符,并在使用它获取请求:

[NSSortDescriptor sortDescriptorWithKey:chosenList.sortKey ascending:chosenList.ascending]; 

然后,只要你想,你可能有多达列表,您可以轻松地使用它的排序键对所有的人进行排序。


如果你想存储在数据库中的位置(你没有在你的ListPosition提到属性index,或任何类似),您可以创建“联合实体”:

entity PersonInList: 
    - index : integer 
    - person -> Person 
    - list –> List 

另一个想法在List实体中直接订购了一组Person对象。

0

我通常将一个索引字段(键入NSNumber)添加到一个实体。在添加项目时计算索引非常容易。只是通过

object.index = person.positions.count 

所以,实际上你不需要职位领域,但职位关系。将个人实体连接到ListPosition实体就足够了。

1

获取ListPosition(它将作为NSMutableSet出现)。然后对Set进行排序,像这样:

NSMutableSet *positionsSet = [personEntity mutableSetValueForKey:@"positions"]; 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"yourSortKey" ascending:NO]; 
NSArray *positionsSortedSet = [positionsSet sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

这将根据您的密钥为您提供一个整理好的数组。