核心数据按两个Descriptor对数据进行排序

Posted

技术标签:

【中文标题】核心数据按两个Descriptor对数据进行排序【英文标题】:Core data sort data by two Descriptor 【发布时间】:2013-09-15 04:22:56 【问题描述】:

我在我的 ios 应用程序中使用了核心数据。现在我有一个表,其中有两列。

    类别

    顺序(其中有 NSNumber 1、2、5)

我想获取数据,所以它会首先按类别名称的字母顺序排序,然后按订单号排序。

我使用了以下代码:

NSEntityDescription *entity_Maintness = [NSEntityDescription
                                             entityForName:@"Maintness" inManagedObjectContext:__managedObjectContext];
    [fetchRequest_Maintness setEntity:entity_Maintness];


    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"serialNumber" ascending:NO];


    NSArray *sortDescriptors12 = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor, nil];
    [fetchRequest_Maintness setSortDescriptors:sortDescriptors12];

但数据仅按类别排序,而不是按序列号。

感谢您的帮助。

【问题讨论】:

您的排序描述符看起来不错。你能展示你的实际结果(和预期的结果)吗? 可能是导致问题的数据类型。例如,如果您有一个字符串类型,并且您想要对 10,15,120 进行排序,您实际上会返回 10,120,15。这曾经让我很头疼。祝你好运 【参考方案1】:

上面的代码看起来没问题。也许您的代码中的其他地方存在问题?这是我为您快速生成的一些代码,可以作为起点??

#import "MainViewController.h"
#import "Maintness.h"

@interface MainViewController ()
@property (weak, nonatomic) IBOutlet UITextField *type;
@property (weak, nonatomic) IBOutlet UITextField *serialNumber;
@property (strong, nonatomic) NSManagedObjectContext *context;
- (IBAction)addButtonPressed:(id)sender;
- (IBAction)retrieveButtonPressed:(id)sender;

@end

@implementation MainViewController

#pragma mark - lazy instantiation
- (NSManagedObjectContext *)context
    if (!_context)
        id appDelegate = (id)[[UIApplication sharedApplication] delegate];
        _context = [appDelegate managedObjectContext];
    
    return _context;


#pragma mark - core data interactions
- (IBAction)addButtonPressed:(id)sender 
    NSError *error = nil;

    Maintness *newMaintness = nil;

    newMaintness = [NSEntityDescription insertNewObjectForEntityForName:@"Maintness" inManagedObjectContext:self.context];

    newMaintness.type = self.type.text;
    newMaintness.serialNumber = self.serialNumber.text;

    if (![self.context save:&error]) 
        NSLog(@"Oh no - error: %@", [error localizedDescription]);
     else 
        NSLog(@"It appears the details were added ok");
    



- (IBAction)retrieveButtonPressed:(id)sender 
    NSError *error = nil;
    // Set up fetch
    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    // Set up entity
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Maintness" inManagedObjectContext:self.context];
    [fetch setEntity:entity];
    // Set up sorting
    //   - sorts in order of array
    NSSortDescriptor *primarySortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES];
    NSSortDescriptor *secondarySortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"serialNumber" ascending:NO];
    NSArray *sortDescriptors = @[primarySortDescriptor, secondarySortDescriptor];
    [fetch setSortDescriptors:sortDescriptors];

    NSArray *results = [self.context executeFetchRequest:fetch error:&error];

    for (Maintness *result in results) 
        NSLog(@"type: %@ serial number: %@", result.type, result.serialNumber);
    

@end

【讨论】:

serialNumber 作为字符串:坏主意。 取决于您的序列号的用途。很多产品的“序列号”中都有字母。我只是想给出一些示例代码,我认为这不是拒绝答案的理由。也许你可以贡献你的想法??

以上是关于核心数据按两个Descriptor对数据进行排序的主要内容,如果未能解决你的问题,请参考以下文章

按日期和字符对核心数据属性进行排序

按 ID 对核心数据进行排序 [重复]

Swift - 按部分对核心数据进行排序

核心日期一对一排序

对核心数据中的相关实体进行排序

从核心数据中按日期对 TableView 进行排序 - Swift4