如何使用NSFetchRequest获取每对用户的最新消息?

时间:2014-09-10 18:20:24

标签: ios sqlite core-data nspredicate nsfetchrequest

我正在构建一些消息传递功能。假设我在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”是当前用户,可以是发件人也可以是收件人。

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

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

我还在考虑在查询中使用group by功能,但还没有解决方案。

编辑#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可以扮演发送者和接收者的角色。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用groupBy来实现此目的。你可以尝试这样的事情:

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