获取最新的孩子在coredata中订购的结果

时间:2013-11-04 14:22:42

标签: ios core-data

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

我使用以下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的新手,无法做到这一点或类似的东西。谁可以指出我正确的方向?

提前致谢!

1 个答案:

答案 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];