Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.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
Java 如何正确解析Firebase DataSnapshot值_Java_Android_Parsing_Firebase_Firebase Realtime Database - Fatal编程技术网

Java 如何正确解析Firebase DataSnapshot值

Java 如何正确解析Firebase DataSnapshot值,java,android,parsing,firebase,firebase-realtime-database,Java,Android,Parsing,Firebase,Firebase Realtime Database,我必须收到一个用户名,其全名等于“Bobby”。因此,我尝试使用以下语法从Firebase数据库获取数据: ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {...} 我从dataSnapshot.getValue()中得到的是: {id3={username=bob, score=150, fullName=Bobby}} 如果我不知道

我必须收到一个
用户名
,其
全名
等于“Bobby”。因此,我尝试使用以下语法从Firebase数据库获取数据:

ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {...}
我从dataSnapshot.getValue()中得到的是:

{id3={username=bob, score=150, fullName=Bobby}}
如果我不知道返回了哪个
id
号码,我想知道获取
username
的最佳或正确方法是什么

目前,我正在通过以下方式实现:

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference("Scores");

    ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(TAG, "dataSnapshot value = "+dataSnapshot.getValue());
            if(dataSnapshot.hasChildren()){
                Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator();
                DataSnapshot snap = iter.next();
                if(snap.hasChildren() && snap.getValue() instanceof HashMap) {
                    HashMap map = (HashMap) snap.getValue();
                    if(map.containsKey("username")) {
                        Log.i(TAG, "onDataChange: username = " + map.get("username"));
                    }
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
提前谢谢

摘要:

使用wilkas的答案,我得到了以下代码片段以获得想要的结果:

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference("Scores");

    ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(TAG, "dataSnapshot value = "+dataSnapshot.getValue());
            if(dataSnapshot.hasChildren()){
                Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator();
                while (iter.hasNext()){
                    DataSnapshot snap = iter.next();
                    String nodId = snap.getKey();
                    String username = (String) snap.child("username").getValue();

                    //received results
                    Log.i(TAG, username + " on nod " + nodId);
                }

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
FirebaseDatabase=FirebaseDatabase.getInstance();
DatabaseReference=database.getReference(“分数”);
参考orderByChild(“全名”).equalTo(“Bobby”).addListenerForSingleValueEvent(新值EventListener()){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
Log.i(标记“dataSnapshot value=“+dataSnapshot.getValue());
if(dataSnapshot.hasChildren()){
迭代器iter=dataSnapshot.getChildren().Iterator();
while(iter.hasNext()){
DataSnapshot snap=iter.next();
字符串nodId=snap.getKey();
字符串用户名=(字符串)snap.child(“用户名”).getValue();
//收到的结果
Log.i(标签、用户名+“在节点上”+节点ID);
}
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});

当多个条目的
全名
等于
'Bobby'

时,它工作得很好,因为您在
分数下添加了侦听器,您的孩子是
id1
id2
id3
。通过添加query
.orderByChild(“fullName”).equalTo(“Bobby”)
您可以按子孩子过滤并得到一个结果
id3
。因此,您的第一个
datasnapshot
指的是一个孩子
id3
(尽管如果他们有相同的“Bobby”名字,可能会有更多的孩子)

为了获得用户名,您需要迭代每个接收到的子项(正如您正确所做的那样)——在本例中,只迭代一个子项——然后获取该迭代子项的child
username

因为您知道每个
idX
都包含以下子项:
username
score
fullName
。您可以按如下方式轻松提取
用户名
(在您的示例中,
snap
是指child
id3
):

此外,您还可以按如下方式检索
id

String recordId = snap.getKey();
String recordId = snap.getKey();
String username = (String) dataSnapshot.child(recordId).child("username").getValue();
在内部迭代中,您还可以获得
username
,如下所示:

String recordId = snap.getKey();
String recordId = snap.getKey();
String username = (String) dataSnapshot.child(recordId).child("username").getValue();

发布您的整个json结构请发布您的json的代表性片段(作为文本,而不是屏幕截图)。您可以通过单击中的导出JSON链接轻松获得此信息。将JSON作为文本使其具有可搜索性,允许我们轻松地使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。