Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从给定UID的Firebase检索Java对象_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

从给定UID的Firebase检索Java对象

从给定UID的Firebase检索Java对象,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我对异步编程非常陌生,对于如何在给定唯一ID的情况下检索Java对象,我有点困惑。我遵循了Firebase网站上给出的关于结构化和读取数据的示例,但我不确定如何在不检索整个列表的情况下检索特定对象。我曾经看到人们检索整个列表并迭代它,直到找到正确的对象,但是我觉得这是非常低效的,不是理想的方法 我的firebase数据库结构 { "chats" : { "defcon69" : { "chatMembers" : { "abc con" : true,

我对异步编程非常陌生,对于如何在给定唯一ID的情况下检索Java对象,我有点困惑。我遵循了Firebase网站上给出的关于结构化和读取数据的示例,但我不确定如何在不检索整个列表的情况下检索特定对象。我曾经看到人们检索整个列表并迭代它,直到找到正确的对象,但是我觉得这是非常低效的,不是理想的方法

我的firebase数据库结构

{
  "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的消息对象。


有一个简单的函数可以实现,我与大家分享一个例子

    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(...);

您的问题中包含了一个指向JSON树图片的链接。请将其替换为实际的JSON文本,您可以通过单击中的导出JSON链接轻松获取。将JSON作为文本使其具有可搜索性,允许我们轻松使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。如果您发布了一些您已经尝试过的代码,这也将是一件好事。这里有数百个关于堆栈溢出的示例。看到您所做的尝试,可以更容易地针对您所处的困境提供帮助。@FrankvanPuffelen我已经成功地使用了我提供的迭代整个列表的示例,但是如果列表的长度开始达到数千或10秒,这似乎是难以置信的低效。