用于核心数据一对多关系的 NSSortDescriptor

Posted

技术标签:

【中文标题】用于核心数据一对多关系的 NSSortDescriptor【英文标题】:NSSortDescriptor for coredata one-to-many relationsip 【发布时间】:2015-09-02 14:24:53 【问题描述】:

我只想知道如何将NSSortDescriptor 设置为NSFetchRequest

我们不能在CoreData 中按比较器进行排序吗?

还有其他解决方法吗? 有什么建议可以改变我的模型以促进这一点?

顺便说一句,我不会事先知道我将添加什么类型的记录值,我将在所有可能的组合中拥有可变数量的记录值。

我有如图所示的核心数据模型,数据存储如下

(当我想按dateValue排序时,只考虑DOB的dataValue排序)

id    stringValue<NSString>  dateValue<NSDate>     record


name     Alex                     -            record1<ZCMORecord>

DOB      -                     10/10/1990      record1<ZCMORecord>

name     Anto                     -            record2<ZCMORecord>

DOB      -                     05/05/1990      record2<ZCMORecord>

name     Max                     -            record3<ZCMORecord>

DOB      -                     10/10/1990      record3<ZCMORecord>

name     Mary                     -            record4<ZCMORecord>

DOB      -                     01/01/1990      record4<ZCMORecord>

【问题讨论】:

【参考方案1】:

这是您对NSFetchedResultsController 进行排序的方式:

- (NSFetchedResultsController *)fetchedResultsController 

    if (_fetchedResultsController != nil) 
        return _fetchedResultsController;
    

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
        entityForName:@"ZCMORecordValue" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortStringValue = [[NSSortDescriptor alloc]
        initWithKey:@"stringValue" ascending:YES];
    NSSortDescriptor *sortDate = [[NSSortDescriptor alloc]
        initWithKey:@"dateValue" ascending:YES];
    [fetchRequest setSortDescriptors:@[sortStringValue, sortDate]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
        [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
            managedObjectContext:managedObjectContext sectionNameKeyPath:nil
            cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;


这将首先按名称排序,然后按日期排序。如果要先按日期排序,然后按名称排序,请反转排序描述符的顺序。

【讨论】:

感谢@SpaceDog 的回答。让我试试这个然后回来 这行不通 :(.. 假设我有一个 id 'addedTime' 以及 name 和 DOB。adddedTime 将是一个 NSDate。所以当我排序时,它也会被考虑在内。这会出错。我想要的是,我想将 Id 指定为 DOB,然后排序。:( 我什至愿意更改模型。 什么是出生日期?你想用什么参数进行排序?

以上是关于用于核心数据一对多关系的 NSSortDescriptor的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:重启时排序的一对多关系

一对多关系核心数据获取数据

如何在一对多核心数据关系中获取特定数据?

核心数据一对多关系

不搜索一对多核心数据关系

核心数据以一对多关系保存在后台