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

Posted

技术标签:

【中文标题】对核心数据中的相关实体进行排序【英文标题】:Sort related entities in core data 【发布时间】:2013-10-22 06:34:46 【问题描述】:

我的核心数据模型中有两个实体。作者和书。一个作者可以有很多本书。 这是我整理出来的部分。一切正常。

现在我想按字母顺序获取我的作者:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Author" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];

目前没有问题。但现在我想获取作者的所有书籍,按发行日期排序。 当我使用以下代码行获取作者的书籍时……

self.selectedAuthor.books.allObjects

……书籍的顺序似乎完全随机。

我的问题:

如何在从核心数据中获取对象的相关实体时对其进行排序,以便每次我使用self.selectedAuthor.books.allObjects时,所有书籍都按(例如)发布日期排序?

【问题讨论】:

【参考方案1】:

您可以在 Author 类接口中添加一个方法 - (NSArray *)booksSortedByDate;,并在实现中编写如下代码:

- (NSArray *)booksSortedByDate 
    return [self.books.allObjects sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"releaseDate" ascending:YES]]];

【讨论】:

Martin R 给出的另一个答案似乎是处理此问题的正确方法,但您的答案最适合我的情况。所以谢谢你!【参考方案2】:

你不能。一对多关系booksNSSet 表示,这是一个 无序集合。你可以

像你一样获取所有书籍self.selectedAuthor.books.allObjects的数组, 然后在内存中对这个数组进行排序,

使用谓词对Book 实体执行获取请求

[NSPredicate predicateWithFormat:@"author = %@", self.selectedAuthor]

仅获取该作者的书籍,并将排序描述符添加到获取请求 以按发行日期排序。

【讨论】:

如果一本书可以有多个作者,有没有办法做第二种方法?

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

核心数据麻烦排序相关对象的 NSSet

Entity Framework 可以按相关实体上的属性对实体进行排序吗?

核心数据:根据实体类型对抽象实体的结果进行排序

在 Objective-C 中按评论数量对核心数据中的 FetchedObjects 数组进行排序

按两个依赖属性对核心数据实体进行排序

为啥向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException?