我正在构建一些消息传递功能。假设我在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可以扮演发送者和接收者的角色。
答案 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]];