2017-06-16 41 views
0

我對於異步編程非常陌生,我對如何在給定唯一ID的情況下檢索Java對象感到困惑。我遵循Firebase網站上關於構建和讀取數據的示例,但我不確定如何在不檢索整個列表的情況下檢索特定對象。我已經看到人們檢索整個列表並遍歷它直到找到正確的對象,但是我覺得這是非常低效的並且不是理想的方法。從給出UID的Firebase中檢索Java對象

我的火力數據庫結構

{ 
    "chats" : { 
    "defcon69" : { 
     "chatMembers" : { 
     "abc con" : true, 
     "rGmgSVGcq4WE6kehY4HH5z7ntIQ2" : true 
     }, 
     "chatMessages" : { 
     "-KmYAcmmvmSfMrOYnAtR" : "-KmYAcmmvmSfMrOYnAtR", 
     "-KmYAmNmjWExC1gcCuF8" : "-KmYAmNmjWExC1gcCuF8", 
     "-KmZuNNG6lZCn_HeA1aq" : "-KmZuNNG6lZCn_HeA1aq" 
     }, 
     "chatName" : "FLT", 
     "chatText" : "hey ", 
     "chatTime" : 1497415382731, 
     "chatUUID" : "defcon69" 
    } 
    }, 
    "messages" : { 
    "defcon69" : { 
     "-KmYAcmmvmSfMrOYnAtR" : { 
     "messageText" : "test", 
     "messageTime" : 1497386352516, 
     "messageUUID" : "-KmYAcmmvmSfMrOYnAtR", 
     "messageUser" : "con" 
     }, 
     "-KmYAf3FKCzJyL8-3_9U" : { 
     "messageText" : "hey",  
     "messageTime" : 1497386361825, 
     "messageUUID" : "-KmYAf3FKCzJyL8-3_9U", 
     "messageUser" : "con" 
     } 
    } 
} 

我特別想給它的UID檢索消息對象。

Example of iterating through list

Structuring Firebase data

+1

您已在您的問題中包含指向JSON樹圖片的鏈接。請用實際的JSON替換爲文本,您可以通過單擊[您的Firebase數據庫控制檯](https://console.firebase.google.com/project/_/database/data/)中的導出JSON鏈接輕鬆獲取該文本。 。將JSON作爲文本可以搜索,使我們能夠輕鬆使用它來測試您的實際數據,並將其用於我們的答案中,並且通常只是一件好事。 –

+0

如果你發佈了一些你已經嘗試過的代碼,那也不錯。 Stack Overflow中有數百個[從Android查詢Firebase數據庫]的示例(https://stackoverflow.com/search?q=%5Bfirebase%5D%5Bandroid%5D+query)。看到你所嘗試過的東西,可以更容易地爲你困擾的地方提供幫助。 –

+0

@FrankvanPuffelen我已經成功地使用了我提供的遍歷整個列表的示例,但是如果列表開始變得數千或數十萬的長度,這看起來非常低效。 – PleaseNoBugs

回答

0

有一個簡單的函數來做到這一點我分享了一個例子

String uid="your uid"; 
    DatabaseReference ref= mDatabase.child("messages").child(uid).getRef(); 

    ref.addValueEventListener(new ValueEventListener() { 

       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if(dataSnapshot.exists()){ 
        Message m=dataSnapshot.getValue(Message.class); 
        // your message is here do what you want 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.i("dberror",databaseError.getMessage()); 
       } 
      }); 

你看這很簡單, 如果你想單值事件監聽器可能會因爲您想要使用該值一次所以儘量使用

ref.addListenerForSingleValueEvent(...);