我正在使用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
.
.
}
非常感谢社区的帮助!
答案 0 :(得分:0)
您的查询看起来不错。您所能做的就是写下查询逻辑,然后转换为Realm查询语法。如果您打算创建一个查询,条件是:
这可能是最好的方法。假设您拥有往返于领域中每个人的所有消息;如果您要应用其他规则(例如,您仅包含包括Realm中已登录用户在内的消息),则可以放弃第2条,因为这暗示了这一点。例如,如果您的API仅为登录用户提供消息(这似乎是合理的情况)。这样可以提高效率并简化查询。
就其他提高效率的方式而言,可能(尽管我没有直接证据)表明,为用户使用数字ID而不是字符串ID可以在Realm中进行更有效的比较和过滤。这将是更好的选择,但还是要取决于您的API。
最后,如果仍保持上述状态,可能值得在查询中添加“括号”以确保对运算符的评估符合您的期望(即,“或”中间的AND)。可以通过查询中的beginGroup
和endGroup
(如here所述)来实现。