Java,Firebase:如何搜索未知父级的值

时间:2017-08-13 13:01:56

标签: java firebase firebase-realtime-database

我在firebase中有一个数据库,看起来像这样:

-Messages
  -randomGenKey
    -receiverUid:string1
    -senderUid:string2 

我正在尝试搜索string1和string2是否为特定值,让我们说" user1"和" user2"分别。我不确定如何才能做到这一点。我知道我可以通过简单的方式获取消息 mMessagesRef = FirebaseDatabase.getInstance().getReference().child("messages"); 但是之后就会卡住,因为当我搜索时,randomGenKey是未知的。

2 个答案:

答案 0 :(得分:2)

正如@creativecreatorormaybenot所说,您可以使用查询来过滤senderUidreceiverUid。但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上了解详情。