2017-02-02 2 views
1

Если у меня есть следующие модели:Realm Java Сортировать по RealmList Ссылка

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

class Message extends RealmObject { 
    long timestamp; 
} 

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

+0

Link сорта пока не поддерживаются. Но создав двунаправленное отношение, вы можете легко сделать запрос типа «realm.where (Message.class) .equalTo (« talkId », conversId) .findAllSorted (« timestamp », Sort.DESCENDING); вам просто нужно надлежащее схема – EpicPandaForce

ответ

1

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

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

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

Далее, вы можете принять требуемый результат с помощью кода ниже:

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

Смежные вопросы