NSSortDescriptor 和多对多关系

Posted

技术标签:

【中文标题】NSSortDescriptor 和多对多关系【英文标题】:NSSortDescriptor and to-many relationships 【发布时间】:2009-10-05 14:44:31 【问题描述】:

我有两种反对意见:地点和历史项目。 我正在尝试获取附加到任何历史记录项的位置,因此我对该位置的获取谓词是“history.@count > 0”,它工作正常。

我还想使用 NSSortDescriptor 按其最新历史项目的日期对位置对象进行排序,据我所知,这将是“history.@max.time”,但这会引发以下错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序, 原因:'包含 KVC 聚合的 Keypath 不应该有; 未能处理历史。@max.time'

Halp plox?

【问题讨论】:

location.history 是一个数组/集合吗? (似乎是一个,但你有一个单数形式。) 这是一个对多的关系,这意味着它是。单数形式是我的错,但我现在不想弄乱它以避免破坏任何东西。 Joonas,你发现了吗?我处于完全相同的情况,并得到同样的错误。谢谢 恐怕我没有,因为我有更紧迫的问题要处理,所以目前列表仍然按照 Core Data 想要表示的方式排序。不过,如果能得到解决方案,那就太好了。 我完全忘记了留下上述评论,并且“不知何故”设法让@“articles.@max.postDate”工作。我跑回这篇文章寻找类似问题的答案。在我尝试使用的另一段代码中:@“@max.unreadArticles”并收到错误:实体搜索不符合键“@max”的键值编码我将发布我可以看到的内容“可能”的事情可能已经解决了,在下面的答案中。 【参考方案1】:

AFAIK,您只能使用Key-Value Coding Programming Guide 中描述的collection operators,作为您的排序描述符的关键路径,使用collections(NSArrayNSSetNSDictionary)。

您不得将集合运算符用于带有提取请求 (NSFetchRequest) 的排序描述符的键路径。

@kdbdallas 正确使用集合运算符对NSArray 进行排序。他没有使用它来指定获取请求的排序描述符。

如果集合运算符能够指定用于对获取请求进行排序的关键路径,那就太好了。请在http://bugreport.apple.com/ 提交此功能请求。报道得越多,他们就越有可能支持它。

【讨论】:

我向 Apple 提交了此问题:ID:9758650,标题:Collection Operators should work with Core Data,产品:iPhone SDK,分类:增强,发起日期:2011 年 7 月 12 日上午 12:26 , 状态:打开 我提交了具有相同标题的 rdar://10468062 以及 Departments 和 Employees 的示例。推荐的人越多越好! 在开放式雷达上找不到错误报告 10468062。这真的很有帮助,所以我可以更容易地欺骗它。【参考方案2】:

可能不是最好的解决方案,但您可以随时拉回数据并在事后对其进行排序。看看Sorting and Filtering NSArray Objects。

【讨论】:

【参考方案3】:

ios 13(和朋友)开始,您应该能够使用派生表达式 max:(history.time) 创建一个名为 historyMaxTime 的 derived attribute,然后设置 fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"historyMaxTime" ascending:NO]]

【讨论】:

【参考方案4】:

这是我做类似的一些代码

NSError *error;

if (![[self fetchedResultsController] performFetch:&error])

    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease];
    [alert show];

else

    self.feedsArray = [fetchedResultsController fetchedObjects];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"articles.@max.postDate" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    self.feedsArray = [feedsArray sortedArrayUsingDescriptors:sortDescriptors];

    [sortDescriptors release];
    [sortDescriptor release];

    NSInteger overviewAmount = [[feedsArray valueForKeyPath:@"@sum.unreadArticles"] integerValue];

    ....

【讨论】:

知道什么可以解决它吗?在该代码中看不到任何可以修复的内容... 我不确定...你有你的实体子类化吗?我的两个都是(所以在上面的示例中,我正在获取的实体和文章实体被子类化)我在文章的子类中没有任何特别之处,所以我真的不记得为什么我将它子类化,所以也许这就是为什么...另一个想法是在我的文章实体中我在要索引的模态中设置@max 的属性 postDate。也许尝试一下。还要确保您的日期值具有默认值。我使用:1980-01-01 00:00:01

以上是关于NSSortDescriptor 和多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

QueryDSL 和多对多关系

如何判断一对一对多和多对多的关系

具有一对多和多对多关系的 JOOQ pojos

Symfony 固定装置和多对多关系(学说)

多表关系一对多和多对多

Typegoose 模型和多对多关系