Я не знаю, как достичь требуемого результата в вашей схеме базы данных и без присоединиться операции (не поддерживается).
Но это может быть достигнуто, если ваша схема базы данных будут перенесены на эту модель:
Примите к сведению: с помощью предложенных моделей, нужно вручную проверить ссылки непротиворечивости «сообщение -> разговор " отношение.
Далее, вы можете принять требуемый результат с помощью кода ниже:
SortedSet<Message> sortedMessagesSet = new TreeSet<>(new Comparator<Message>() {
@Override
public int compare(Message message1, Message message2) {
return (int) (message2.timestamp - message1.timestamp);
}
});
List<Conversation> emptyConversations = new ArrayList<>();
// take "top" messages of each conversation
for (Conversation conversation : realm.where(Conversation.class).findAll()) {
RealmResults<Message> sortedMessages = realm.where(Message.class).
equalTo("conversationId", conversation.getId()).
findAllSorted("timestamp", Sort.DESCENDING);
// append latest (by time) message to the sorted messages set
if (!sortedMessages.isEmpty()) sortedMessagesSet.add(sortedMessages.first());
// remember conversations without messages
else emptyConversations.add(conversation);
}
List<Conversation> sortedConversations = new ArrayList<>(sortedMessagesSet.size() + emptyConversations.size());
// take conversations sorted by messages
for (Message message : sortedMessagesSet)
sortedConversations.add(realm.where(Conversation.class).
equalTo("id", message.getConversationId()).findFirst());
// append empty conversations to the end
sortedConversations.addAll(emptyConversations);
1. Текущая версия области является 2.3.0
Link сорта пока не поддерживаются. Но создав двунаправленное отношение, вы можете легко сделать запрос типа «realm.where (Message.class) .equalTo (« talkId », conversId) .findAllSorted (« timestamp », Sort.DESCENDING); вам просто нужно надлежащее схема – EpicPandaForce