1

我有一个表公司和一个表消息。现在我想向用户显示按最新消息排序的公司列表。因此,当一家公司向用户发送消息时,该公司位于列表顶部,直到另一家公司发送消息。

我对 android 版本使用了以下 sql 查询

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 的新手,无法执行此操作或类似操作。谁能指出我正确的方向?

提前致谢!

4

1 回答 1

0

使用以下谓词获取公司

[NSPredicate predicateWithFormat:@"ANY messages.read = %@", @NO];

和这个排序描述符

[NSSortDescriptor sortDescriptorWithKey@"@max.messages.timestamp" ascending:NO]

从上面的删除线可以看出,您不能@max在排序描述符中使用聚合运算符。不过,您可以有一个瞬态属性,如下所示:

向 Company 实体添加一个新属性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];
于 2013-11-04T15:51:29.647 回答