【问题标题】:Core data, sorting one-to-many child objects核心数据,一对多子对象排序
【发布时间】:2011-02-01 05:30:56
【问题描述】:

所以,假设我有一个父母孩子的商店,父母与孩子有一对多的关系(parent.children),他们都有名字。现在,在对父母的初始提取中,我可以指定一个排序描述符以按名字的顺序将它们取回,但我如何才能按顺序请求孩子呢?如果我做一个 [parent.children allObjects] ,它只会把它们弄得一团糟,我每次都必须在事后进行排序。

谢谢, 山姆

【问题讨论】:

    标签: iphone objective-c xcode core-data


    【解决方案1】:

    山姆,

    如果我正确阅读了您的问题,您希望设置一个 fetch 以返回特定父级的子级的排序列表。为此,我将为“子”实体设置一个提取,然后使用谓词来限制结果:

    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 实例的引用。

    【讨论】:

    • 我明白了,您是在建议运行 fetch 而不是仅使用 coredata 中的错误?是不是性能比较差?即使用谓词设置获取并运行它比仅执行 [parent.children allObjects] 并让 managedObject 填补错误更昂贵?
    • 我认为你是正确的,运行一个全新的 fetch 请求将比用 [parent.children allObjects] 填充错误然后对你得到的 NSArray 进行排序要慢。在我看来,新的 fetch 请求的优点是您可以使用 NSFetchedResultsController 来保持结果集的更新和排序(即,如果您创建父级的新子级,它会自动将其插入结果列表中)。如果您计划将孩子列表保留任何时间长度并且列表可能会更改(即您正在显示可编辑列表),我会使用此策略。
    【解决方案2】:

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

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

    【讨论】:

    • Shosti - 对多对关系的“allObjects”调用是否确保该关系中的所有对象都出现故障,并且如果以前没有,现在在内存中?有时父实体是在没有急切获取关系的情况下获取的,然后,我们确实希望所有子实体(可能相关的对象)都存在。我想知道这是否可以保证在特定关系中总是触发所有错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2016-08-16
    相关资源
    最近更新 更多