我正在構建一些消息功能。假設我已經在Core Data中定義了一個具有「senderId」,「receiverId」和「time」屬性的消息實體。如何使用NSFetchRequest爲每對用戶提取最新消息?
我想創建一個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」是當前用戶,它可能是發送者或接收者。
當前狀態不起作用,因爲我不知道如何「關聯」第一種情況(當前用戶是發件人)和第二種情況(當前用戶是接收者)(標記爲「?」) ?其他用戶在請求之前不知道。它必須是同一個用戶。
通過使用「時間」屬性對它進行排序,我會得到最新的第一個,也是第二個最新的,等等。我想要獲得每對用戶的最後一條消息。
我也在考慮在查詢中使用group by feature,但還沒有解決方案。
編輯#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];
它所做的是分組具有相同的Sender ID和receiverId星座消息的實體,而是它不會將每個具有user1的用戶對(所有用戶可能是每個消息實體的發送者或接收者)的所有消息實體進行分組,並且user2可能扮演發送者和接收者的角色。