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”名字,可能会有更多的孩子)
为了获得用户名,您需要迭代每个接收到的子项(正如您正确所做的那样)——在本例中,只迭代一个子项——然后获取该迭代子项的childusername
因为您知道每个idX
都包含以下子项:username
,score
,fullName
。您可以按如下方式轻松提取用户名
(在您的示例中,snap
是指childid3
):
此外,您还可以按如下方式检索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作为文本使其具有可搜索性,允许我们轻松地使用它来测试您的实际数据,并在我们的答案中使用它,这通常是一件好事。