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(NSArray
、NSSet
、NSDictionary
)。
您不得将集合运算符用于带有提取请求 (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 和多对多关系的主要内容,如果未能解决你的问题,请参考以下文章