从Realm检索聊天消息的有效方法是什么?

时间:2019-05-23 17:00:53

标签: java android database realm firebase-cloud-messaging

我正在使用FCM创建聊天应用程序,因此同时使用令牌和主题。在我的应用程序中,我创建了一个POJO,它扩展了RealmObject,该RealmObject用于存储来自不同用户ID以及我发送的消息的聊天消息,包括私人聊天和群组聊天。 但是我不明白的是,如何构造领域查询以检索接收到的消息以及已发送给UserID的消息。

我正在考虑尝试:

RealmResults<ChatModel> results=mDatabase.where(TestChatModel.class)
                                .equalTo("sender",<Person with whom Im chatting's userID >)
                                .or()
                                .equalTo("receiver",<Person with whom Im chatting's userID >)
                                .and()
                                .equalTo("sender",<My userID >)
                                .or()
                                .equalTo("receiver",<My userID >
                                .sort("timestamp")
                                .findAll();

但这似乎效率很低而且很混乱。

我的POJO是:

public class TestChatModel {
    private String chatMessage;
    private String timestamp;
    private String sender;
    private String receiver;
    private String topicName; // Set to NA is private-chat
    private int isTopic;      // Set to 0 for private-chat and Set to 1 for 
                              // group
.
.
.
//Associated constructors and getters and setters
.
.
}

非常感谢社区的帮助!

1 个答案:

答案 0 :(得分:0)

您的查询看起来不错。您所能做的就是写下查询逻辑,然后转换为Realm查询语法。如果您打算创建一个查询,条件是:

  1. 特定的人是发送者或接收者,并且
  2. 已登录的用户,即发送者或接收者

这可能是最好的方法。假设您拥有往返于领域中每个人的所有消息;如果您要应用其他规则(例如,您仅包含包括Realm中已登录用户在内的消息),则可以放弃第2条,因为这暗示了这一点。例如,如果您的API仅为登录用户提供消息(这似乎是合理的情况)。这样可以提高效率并简化查询。

就其他提高效率的方式而言,可能(尽管我没有直接证据)表明,为用户使用数字ID而不是字符串ID可以在Realm中进行更有效的比较和过滤。这将是更好的选择,但还是要取决于您的API。

最后,如果仍保持上述状态,可能值得在查询中添加“括号”以确保对运算符的评估符合您的期望(即,“或”中间的AND)。可以通过查询中的beginGroupendGroup(如here所述)来实现。