2014-09-10 6 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]; 

«идентификатор пользователя» является текущий пользователь, который может быть либо отправитель или получатель.

Текущее состояние не работает, потому что я не знаю, как «связать» первый случай (текущий пользователь отправитель), а второй случай (текущий пользователь - приемник) (помечен как «?») ? Другой пользователь не известен до запроса. Он должен быть одним и тем же пользователем.

Сортируя это, используя свойство «время», я бы получил последнее сообщение, но также и второе, и так далее. Я хочу получить последнее сообщение на пару пользователей.

Я также думал об использовании функции group by в запросе, но пока нет решения.

EDIT # 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

Я думаю, вы можете создать группу пользователей для этого. Вы можете попробовать что-то вроде этого:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"TheEntityName" inManagedObjectContext:managedObjectContext]; 
NSAttributeDescription* receiverIdDesc = [entity.attributesByName objectForKey:@"receiverId"]; 
NSAttributeDescription* senderIdDesc = [entity.attributesByName objectForKey:@"senderId"]; 
[theFetchRequest setPropertiesToGroupBy:@[receiverIdDesc, senderIdDesc]]; 
Смежные вопросы