Core Data 根据是不是存在关系对描述符进行排序?

Posted

技术标签:

【中文标题】Core Data 根据是不是存在关系对描述符进行排序?【英文标题】:Core Data sort descriptors based on whether a relationship exists?Core Data 根据是否存在关系对描述符进行排序? 【发布时间】:2013-05-30 12:16:57 【问题描述】:

我有一个Wishlist 实体和一个Item 实体。它们具有双边对多的可选关系,即一个项目可以在 0 个或多个愿望清单中,而一个愿望清单可以包含 0 个或多个项目。

如果我选择wishlist.items,我会得到某个愿望清单中的所有项目。现在,我想做一个获取请求,而不是按愿望清单名称的字母顺序对我的所有愿望清单进行排序(就像现在这样),而是按这些愿望清单是否有项目。

它应该使用 2 个优先级对 Wishlists 进行排序:

1 - 按愿望清单中是否有项目排序(将没有的项目放在顶部)

2 - 如果绑定则按名称排序(如果两者都有/没有项目)

所以,如果我有 3 个愿望清单,一个有 2 个名为“apple”的项目,另一个没有名为“test”的项目,另一个有 3 个名为“android”的项目,它应该按如下方式对它们进行排序,从上到下:

 1. test
 2. android
 3. apple

如何使用排序描述符来实现这一点?我的谓词是 nil,因为我正在获取 Core Data 中的所有愿望清单。

【问题讨论】:

【参考方案1】:

解决这个问题的一种方法是这样的:

获取两组心愿单(一组有物品,一组没有)

NSPredicate *withoutItems = [NSPredicate predicateWithFormat:@"items.@count == 0"];
NSPredicate *withItems    = [NSPredicate predicateWithFormat:@"items.@count != 0"];

每个都应该在获取请求中具有相同的排序描述符:

NSSortDescriptor *byName  = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];

现在一旦你执行了请求,你应该有两个(排序的)数组:

// Provided that you have a managedObjectContext
// and your fetch requests set up 
NSArray *emptyLists    = [moc executeFetchRequest:requestForEmpty error:&error];
NSArray *nonEmptyLists = [moc executeFetchRequest:requestForNonEmpty error:&error];

最后,如果您需要某种统一的数据源,您可以将它们组合起来:

NSArray *allSorted = [emptyLists arrayByAddingObjectsFromArray:nonEmptyLists];

【讨论】:

这看起来不错,但是如何将allSorted 数组放入我的fetchedResultsController 以便它可以更新tableView?它只需要一个 fetch 请求作为初始化。 嗯抱歉不知道您使用的是fetchedResultsController。虽然已经在研究一个新想法...... 我使用它是因为这样更新我的表要容易得多,我只是设置了我想要的获取请求,它会自动更新tableView。期待看到你能想出什么! 好的,我已经尝试了一些方法,但恐怕在您的情况下,最好的选择是放弃fetchedResultsController。话虽如此,如果有人能提出一个体面的解决方案,我也会很高兴知道它。我将保留答案,因为该解决方案适用于非 fetchedResultsController 场景。 我不能放弃它,对不起。这对我的设计至关重要。

以上是关于Core Data 根据是不是存在关系对描述符进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Core Data Predicate 用于根据相关数据进行过滤

如何检查关系是不是已建立 - Core Data

如何根据来自多个 Core Data 属性的计算值进行排序

不要 nil Core Data 反向关系

如何根据多对关系集是不是包含特定值使用 NSPredicate 进行过滤

Core Data Fetched Properties 对对象之间的连接性进行排名