2017-06-16 27 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(...); 
相关问题