我在firebase中有一个数据库,看起来像这样:
-Messages
-randomGenKey
-receiverUid:string1
-senderUid:string2
我正在尝试搜索string1和string2是否为特定值,让我们说" user1"和" user2"分别。我不确定如何才能做到这一点。我知道我可以通过简单的方式获取消息
mMessagesRef = FirebaseDatabase.getInstance().getReference().child("messages");
但是之后就会卡住,因为当我搜索时,randomGenKey是未知的。
答案 0 :(得分:2)
正如@creativecreatorormaybenot所说,您可以使用查询来过滤senderUid
或receiverUid
。但Firebase数据库查询只能过滤一个属性,因此您无法使用它来过滤这两个属性。您可以将这两个值组合成一个属性并对其进行过滤。有关此过滤器和其他过滤器的更多信息,请参阅我的答案:http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase
但是,由于您似乎正在创建一个消息传递应用程序,我还考虑了另一种数据结构。如果您的用户进行1:1对话,我建议您查看将每个对话建模为树中节点的数据结构。因此,不要在应用程序的所有用户(非常多的SQL模型)之间留下一长串消息,而是将其建模为多个(小得多)对话:
-Messages
-keyOfRoomOne
-message1
-message2
-keyOfRoom2
-message1
-message2
然后还为每个用户保留所有房间的列表:
-Users
-Uid1
-keyOfRoomOne
-keyOfRoomTwo
-Uid2
-keyOfRoomOne
-Uid3
-keyOfRoomTwo
使用此结构,您可以在聊天开始时查找房间ID,这比每条消息的频率低得多。
或者,您可以使用反映其中用户的房间名称,甚至不需要查找。有关详情,请参阅http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-channels-in-firebase
答案 1 :(得分:1)
FirebaseDatabase.getInstance().getReference("messages").orderByChild("receiverUid").equalTo("user1")
你不能使用两个查询,所以这就是你得到的。通过遍历所有结果对象,您将能够检查客户端上senderUid
是否等于user2
。在this here上了解详情。