【发布时间】: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