2017-08-13 24 views
1

我在火力點有一個數據庫,看起來有點像這樣的價值觀:的Java,火力地堡:如何尋找未知的父

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

我試圖尋找是否字符串1和字符串是一個特定的值,可以說「user1」和「user2」。我不確定我是如何做到這一點的。我知道我可以通過簡單的做到 mMessagesRef = FirebaseDatabase.getInstance().getReference().child("messages"); 但之後卡住,因爲我搜索時randomGenKey是未知的。

+0

正如Frank van Puffelen在他的回答中解釋的,他們的關鍵是重複的數據。我發現爲每次聊天創建密鑰的一種有效方法是清理兩個用戶的電子郵件,然後加入他們。刪除點,你可以離開符號。並將它們添加到一起以創建唯一的密鑰。您可以通過按字母順序添加兩個字符串來安全地完成它。例如:「jhon @ gmailDOTcom - user1 @ mailDOTcom」 – cutiko

回答

1
FirebaseDatabase.getInstance().getReference("messages").orderByChild("receiverUid").equalTo("user1") 

你不能使用兩個查詢,所以這是你得到的。通過遍歷所有結果對象,您將能夠檢查客戶端上的senderUid是否等於user2。查找更多關於this here

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