Realm Java Сортировка по ссылке RealmList

Если у меня есть следующие модели:

class Conversation extends RealmObject {
    RealmList<Message> messages;
}

class Message extends RealmObject {
    long timestamp;
}

Как я могу сказать: дайте мне все Conversations со списком Message отсортированных, а Conversations отсортированных по верхнему элементу в сообщениях?


person Eliezer    schedule 02.02.2017    source источник
comment
Сортировка ссылок пока не поддерживается. Но, создав двунаправленное отношение, вы можете легко сделать такой запрос, как realm.where(Message.class).equalTo("conversationId", conversationId).findAllSorted("timestamp", Sort.DESCENDING);, вам просто нужна правильная схема   -  person EpicPandaForce    schedule 03.02.2017


Ответы (1)


Я не знаю, как добиться нужного результата в вашей схеме базы данных и без операций join (пока не поддерживается1).

Но этого можно добиться, если ваша схема базы данных будет переведена на эту модель:

class Conversation extends RealmObject {
    @PrimaryKey
    long id;

    public Long getId() {
        return id;
    }
}

class Message extends RealmObject {
    long timestamp;
    long conversationId;

    public long getConversationId() {
        return conversationId;
    }
}

Обратите внимание: используя предложенные модели, вам необходимо вручную проверить согласованность ссылок отношения "сообщение -> разговор".

Далее вы можете получить требуемый результат по коду ниже:

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

person XIII-th    schedule 03.02.2017