【问题标题】:How to fetch latest message per pair of users with NSFetchRequest?如何使用 NSFetchRequest 获取每对用户的最新消息?
【发布时间】:2014-11-04 12:21:13
【问题描述】:

我正在构建一些消息传递功能。假设我在 Core Data 中定义了一个消息实体,其属性为“senderId”、“receiverId”和“time”。

我想创建一个 NSFetchRequest,它返回为每对用户发送的最新消息。

这个想法是使用 NSPredicate。这是我目前拥有的:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(receiverId = %@ && senderId = ?) || (senderId = %@ && receiverId = ?)", userId, userId];
[fetchRequest setPredicate:pred];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:NO];
fetchRequest.sortDescriptors = @[descriptor];

“userId”是当前用户,可以是发送者也可以是接收者。

当前状态不起作用,因为我不知道如何“关联”第一种情况(当前用户是发送者)和第二种情况(当前用户是接收者)(用“?”标记)?其他用户在请求之前是未知的。它必须是同一个用户。

通过使用“时间”属性对其进行排序,我会首先得到最新的,但也会得到第二个最新的,依此类推。我想获得每对用户的最后一条消息。

我也在考虑在查询中使用按功能分组,但还没有解决方案。

编辑#1:

根据 Wilko X 的回答,我创建了以下代码:

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"ENTITY"];
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"senderId", @"receiverId", nil]];
[fetchRequest setPropertiesToGroupBy:[NSArray arrayWithObjects:@"senderId", @"receiverId", nil]];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
 NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"time" ascending:NO];
fetchRequest.sortDescriptors = @[descriptor];
 self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                     managedObjectContext:context
                                                                       sectionNameKeyPath:nil
                                                                                cacheName:nil];

它所做的是对具有相同 senderId 和 receiverId 星座的消息实体进行分组,但它不会对同时具有 user1 的每对用户的所有消息实体进行分组(用户可能是每个消息实体的发送者或接收者)和user2 可以扮演发送者和接收者的角色。

【问题讨论】:

    标签: ios sqlite core-data nspredicate nsfetchrequest


    【解决方案1】:

    我认为您可以通过用户 groupBy 来实现这一点。你可以试试这样:

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TheEntityName" inManagedObjectContext:managedObjectContext];
    NSAttributeDescription* receiverIdDesc = [entity.attributesByName objectForKey:@"receiverId"];
    NSAttributeDescription* senderIdDesc = [entity.attributesByName objectForKey:@"senderId"];
    [theFetchRequest setPropertiesToGroupBy:@[receiverIdDesc, senderIdDesc]];
    

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2020-12-25
      • 2015-05-12
      • 2021-07-25
      • 1970-01-01
      • 2016-11-02
      • 2014-01-18
      • 2019-04-13
      • 1970-01-01
      相关资源
      最近更新 更多