当实体与另一个实体有关系时如何从核心数据中提取排​​序列表

How to pull a sorted list from Core Data when the entity has a relation to another entity

我有两个实体:ProductCategory。它们是这样定义的:

产品

名称=字符串

代码=字符串

fromCategory = 与类别的关系,toOne

类别

类别=字符串

toProduct = 与产品的关系,toMany

所以一个产品只能属于一个类别,一个类别可以分配给多个产品。

这就是问题所在。我有这样的产品:

如果我从按名称排序的核心数据中提取一个列表,我会得到这个

但我想要的是:

换句话说,我希望它主要按类别排序,然后按名称排序,因为我希望相关项目一起出现在 table 视图中。

这是我必须提取的代码,按产品名称排序:

@interface NSObject (ProductsBundlesExtensions)

+(NSArray *)sortDescriptorArrayByKey:(NSString *)key;

@end


@implementation NSObject (ProductsBundlesExtensions)



+(NSArray *)sortDescriptorArrayByKey:(NSString *)key {
  return @[[NSSortDescriptor sortDescriptorWithKey:key
                                       ascending:YES
                                        selector:@selector(localizedStandardCompare:)]];
}

@end


+ (NSArray*)allSortedItemsInContext:(NSManagedObjectContext *)context
{
  NSFetchRequest *request = [[NSFetchRequest alloc] init];

  request.entity = [NSEntityDescription entityForName:NSStringFromClass([self class])
                               inManagedObjectContext:context];

  // sorting by product's name
  [request setSortDescriptors:[NSObject sortDescriptorArrayByKey:@"name"]];

  NSError *error;
  NSArray *all = [context executeFetchRequest:request error:&error];

  return all;
}

这是我的问题:如果是实体关系,我该如何按类别排序?什么 NSSortDescriptor 会那样做?按关系排序,然后按名称排序?

只需使用两个排序描述符(NSObject 类别限制太多,无法使用)

[request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"fromCategory.category"] 
                                                           ascending:YES 
                                                            selector:@selector(localizedStandardCompare:),
                             [NSSortDescriptor sortDescriptorWithKey:@"name"] 
                                                           ascending:YES 
                                                            selector:@selector(localizedStandardCompare:)]];

您可以扩展类别以考虑多个键

+ (NSArray *)sortDescriptorArrayByKeys:(NSArray<NSString *> *)keys {
  NSMutableArray *descriptors = [NSMutableArray array];
  for (NSString *key in keys) {
    [descriptors addObject:[NSSortDescriptor sortDescriptorWithKey:key
                                                         ascending:YES
                                                          selector:@selector(localizedStandardCompare:)]];
  }
  return [descriptors copy];
}

那你可以写

[request setSortDescriptors:[NSObject sortDescriptorArrayByKeys:@[@"fromCategory.category", @"name"]]];

Vanadian 解决方案对我不起作用,因为类别关系是一对多类型。我在网上读到,您不能按一对多关系排序,这就是应用程序崩溃的原因。

我的情况的正确答案是不可能。