当实体与另一个实体有关系时如何从核心数据中提取排序列表
How to pull a sorted list from Core Data when the entity has a relation to another entity
我有两个实体:Product
和 Category
。它们是这样定义的:
产品
名称=字符串
代码=字符串
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 解决方案对我不起作用,因为类别关系是一对多类型。我在网上读到,您不能按一对多关系排序,这就是应用程序崩溃的原因。
我的情况的正确答案是不可能。
我有两个实体:Product
和 Category
。它们是这样定义的:
产品
名称=字符串
代码=字符串
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 解决方案对我不起作用,因为类别关系是一对多类型。我在网上读到,您不能按一对多关系排序,这就是应用程序崩溃的原因。
我的情况的正确答案是不可能。