【问题标题】:Realm Java Sort By RealmList LinkRealm Java 按 RealmList 排序链接
【发布时间】:2017-02-02 17:38:24
【问题描述】:

如果我有以下型号:

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

class Message extends RealmObject {
    long timestamp;
}

我怎么说:给我所有的ConversationsMessage 的列表排序,Conversations 按消息中的顶部项目排序

【问题讨论】:

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

标签: realm realm-list realm-java


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    相关资源
    最近更新 更多