所以我读过如何在核心数据中使用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 ...
答案 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>