2010-03-26 38 views
10

因此,可以说我有一个父母子女的商店,父母与子女有一对多的关系(parent.children),他们都有名字。现在,在父母的初始提取中,我可以指定一个排序描述符,按照名字的顺序将其返回,但我怎么才能请求孩子们?如果我做了一个[parent.children allObjects],它只是让他们陷入混乱中,每次都必须事后排序。核心数据,排序一对多子对象

感谢, 山姆

回答

11

山姆,

如果我读你的问题正确,要建立一个获取返回特定父的孩子的排序列表。要做到这一点,我会成立一个为获取“孩子们”的实体,然后使用谓词限制结果:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"children" inManagedObjectContext:moc]]; 
[request setSortDescriptors:[NSArray initWithObject:[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"(parent == %@)", parent]]; 

显然,你的实体和属性名称可能是不同的。在最后一行中,父变量应该是对你想要的子对象的父对象的NSManagedObject实例的引用。

+0

我明白了,你是在暗示运行抓取,而不是仅仅使用coredata的错?性能不那么好?即使用谓词设置提取并运行它比仅执行[parent.children allObjects]并让managedObject填充错误更昂贵? – Shizam 2010-03-26 15:28:56

+0

我认为你是正确的,运行一个全新的获取请求将比填写[parent.children allObjects]错误然后排序你得到的NSArray慢。 在我看来,新获取请求的好处是你可以使用NSFetchedResultsController来保持结果集的更新和排序(即如果你创建了一个新的父子项,它会自动将其插入到结果列表中) 。如果您计划将孩子的列表保留一段时间并且列表可能会发生变化(即您正在显示可编辑列表),那么我会使用此策略。 – 2010-03-26 15:51:47

16

如果你只是想使用一个NSArray,而不是一个NSFetchedResultsController,有另一种方式:

NSSortDescriptor *alphaSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
NSArray *children = [[parent.children allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:alphaSort]]; 
+0

Shosti - 对多对多关系中的'allObjects'调用是否确保该关系中的所有对象都存在故障并且现在在内存中(如果先前不存在)?有时候,父类实体被提取而没有预先获取的关系,然后,我们希望所有的子类(可能相关的对象)都存在。我想知道这是否能保证在这种特殊的关系中始终绊倒所有的错误。 – idStar 2012-02-16 17:33:20