领域 Java 按领域列表排序 Link
Realm Java Sort By RealmList Link
如果我有以下机型:
class Conversation extends RealmObject {
RealmList<Message> messages;
}
class Message extends RealmObject {
long timestamp;
}
我怎么说:给我所有 Conversations
列表 Message
排序,Conversations
按消息中的顶部项目排序?
我不知道,如果没有 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;
}
}
注意:使用建议的模型,您需要手动检查 "message -> conversation" 关系的引用一致性。
接下来,您可以通过以下代码获取所需的结果:
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.当前的 realm 版本是 2.3.0
如果我有以下机型:
class Conversation extends RealmObject {
RealmList<Message> messages;
}
class Message extends RealmObject {
long timestamp;
}
我怎么说:给我所有 Conversations
列表 Message
排序,Conversations
按消息中的顶部项目排序?
我不知道,如果没有 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;
}
}
注意:使用建议的模型,您需要手动检查 "message -> conversation" 关系的引用一致性。
接下来,您可以通过以下代码获取所需的结果:
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.当前的 realm 版本是 2.3.0