2014-09-10 76 views
0

我正在構建一些消息功能。假設我已經在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可能扮演發送者和接收者的角色。

回答

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]]; 
相關問題