我有一个表公司和一个表消息。 现在我想向用户显示按最新消息排序的公司列表。 因此,当公司向用户发送消息时,公司位于列表顶部,直到另一家公司发送消息。
我使用以下sql查询为Android版
SELECT * FROM (SELECT
c.id, c.title, c.otherfields
m.title as lastMessageIntro,
m.timestamp as lastMessageTimestamp,
CASE WHEN rm.read IS NULL THEN 1 ELSE rm.read END AS noNewMessage
FROM Company c
LEFT JOIN Message m ON c.id = m.id
LEFT JOIN Message rm ON c.id = rm.id AND rm.read = 0
WHERE m.id IS NOT NULL
ORDER BY m.timestamp) as t1
GROUP BY c.id
ORDER BY lastMessageTimestamp DESC;
我是iOS和CoreData的新手,无法做到这一点或类似的东西。谁可以指出我正确的方向?
提前致谢!
答案 0 :(得分:0)
使用以下谓词
获取公司[NSPredicate predicateWithFormat:@"ANY messages.read = %@", @NO];
和这个排序描述符 <击> 撞击>
<击>[NSSortDescriptor sortDescriptorWithKey@"@max.messages.timestamp" ascending:NO]
击> <击> 撞击>
正如您在上面的删除操作中所看到的,您不能在排序描述符中使用@max
聚合运算符。你可以拥有一个瞬态属性,如下所示:
向公司实体添加新属性lastMessageDate
,使其成为非瞬态和可选项,并对其getter进行编程以检索最新消息。
-(NSDate *)lastMessageDate {
if (!self.messages.count) {
return nil;
}
NSArray *sorted = [self.messages sortedArrayUsingDescriptors:
@[[NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES]]];
return [sorted.lastObject timestamp];
}
您可能还需要覆盖影响此属性的getter。
但是现在你可以使用这个sortDescriptor:
[NSSortDescriptor sortDescriptorWithKey:@"lastMessageDate" ascending:NO];