0

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

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

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

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

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

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

 1. test
 2. android
 3. apple

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

4

1 回答 1

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];
于 2013-05-30T13:17:13.190 回答