RealmJava按RealmList链接排序

RealmJava按RealmList链接排序,realm,realm-list,realm-java,Realm,Realm List,Realm Java,如果我有以下型号: class Conversation extends RealmObject { RealmList<Message> messages; } class Message extends RealmObject { long timestamp; } 类对话扩展了RealmObject{ RealmList消息; } 类消息扩展了RealmObject{ 长时间戳; } 我怎么说:给我所有的对话,并对消息列表进行排序,对话按消息中的顶部项目进

如果我有以下型号:

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

class Message extends RealmObject {
    long timestamp;
}
类对话扩展了RealmObject{
RealmList消息;
}
类消息扩展了RealmObject{
长时间戳;
}

我怎么说:给我所有的
对话
,并对
消息列表
进行排序,
对话
按消息中的顶部项目进行排序?

我不知道,如何在您的数据库方案中实现所需的结果,而不进行连接操作(不支持yet1)

但如果您的数据库方案将迁移到此模型,则可以实现:

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);
SortedSet-sortedMessageSet=新树集(新比较器(){
@凌驾
公共整数比较(消息message1、消息message2){
返回(int)(message2.timestamp-message1.timestamp);
}
});
List emptyConversations=new ArrayList();
//记下每个对话的“顶部”信息
for(Conversation:realm.where(Conversation.class.findAll()){
RealmResults sortedMessages=realm.where(Message.class)。
equalTo(“conversationId”,conversation.getId())。
findAllSorted(“时间戳”,排序。降序);
//将最新(按时间)消息附加到已排序的消息集
如果(!sortedMessages.isEmpty())sortedMessageSet.add(sortedMessages.first());
//记住没有信息的对话
否则清空会话。添加(会话);
}
List sortedConversations=new ArrayList(SortedMessageSet.size()+emptyConversations.size());
//将对话按消息排序
用于(消息:SortedMessageSet)
sortedConversations.add(realm.where(Conversation.class))。
equalTo(“id”,message.getConversationId()).findFirst());
//将空对话追加到结尾
sortedConversations.addAll(emptyConversations);

一,。realm的当前版本为2.3.0

链接排序尚不受支持。但是通过创建一个双向关系,您可以轻松地进行如下查询:realm.where(Message.class).equalTo(“conversationId”,conversationId).findAllSorted(“timestamp”,Sort.DESCENDING)您只需要一个合适的模式