核心数据:如何获得分组数据的第一行?

时间:2014-05-27 08:10:49

标签: iphone core-data ios7

所以我读过如何在核心数据中使用Group By,但似乎只限于返回聚合函数返回的分组属性和值。

具体来说,我想要每组中第一行的数据。

我的应用在应用用户和其他人之间进行了对话。在首页上,它只显示每个对话中的最后一条消息。

我的想法是,就像在MySQL中一样,我可以按对等分组并按日期排序(desc)。但在核心数据中,它不允许我获取未聚合的属性。

我应该将其分解为一个包含许多消息的Conversation实体。并将我想要的字段存储在会话实体中(所以我不必进行嵌套查找)?或者有没有办法只用一个'消息'实体来实现这个目标?

我得到的例外:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'SELECT clauses in queries with GROUP BY components can only contain properties named 
in the GROUP BY or aggregate functions 
((<NSAttributeDescription: 0xd271240>), name oid, isOptional 0, isTransient 0, entity ...

1 个答案:

答案 0 :(得分:1)

对于“数据库思考”问题,这是一个非常好的案例研究,它阻碍了一个非常简单的对象图解决方案。

在您的用户列表中,您可能正在使用NSFetchedResultsController。您获取的实体是用户,我们称之为NSManagedObject子类User

User类中,您只需要实现一个方法来获取最后一条消息。 (您也可以在列表中实现此功能,但逻辑上它属于实体。)例如:

-(Message*)lastMessageToUser:(User*)user {
   NSSet *filteredMessages = [self.messages filteredSetUsingPredicate:
     [NSPredicate predicateWithFormat:@"receiver = %@", user]];
   NSArray *sortedMessages = [filteredMessages sortedArrayUsingDescriptors:
     @[[NSSortDescriptor sortDescriptorWithKey:"receivedDate" ascending:NO]]];
   return sortedMessages.count ? sortedMessages.firstObject : nil;
}

在您的列表中,您现在只需在表视图行中的用户上调用此方法即可获取消息。

其他建议:在User类的类别中实现此功能,因此如果必须在模型更改时重新生成模型类,则不会覆盖它。 < / p>