核心数据排序描述符基于是否存在关系?

时间:2013-05-30 12:16:58

标签: ios objective-c sorting core-data nssortdescriptor

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

如果我wishlist.items,我会收到某个心愿单中的所有项目。现在,我想做一个获取请求,并按照心愿单名称的字母顺序排序所有我的愿望清单(就像它现在正在做的那样),但是这些愿望清单是否有物品。

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

1 - 按愿望清单是否包含物品排序(放置不在顶部的物品)

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

所以,如果我有3个愿望清单,一个有两个名为'apple'的项目,另一个没有名为'test'的项目,另一个有3个名为'android'的项目,它应按如下方式排序,从上到下:

 1. test
 2. android
 3. apple

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

1 个答案:

答案 0 :(得分: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];