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 个优先级对 Wishlist
s 进行排序:
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 用于根据相关数据进行过滤