我必须收到一个username
fullName
等于" Bobby"。因此,我尝试使用以下语法从Firebase数据库获取数据:
ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {...}
我从dataSnapshot.getValue()
获得的是:
{id3={username=bob, score=150, fullName=Bobby}}
如果我不知道返回了哪个username
号码,我想知道获取id
的最佳或正确方法是什么?
目前我正是这样实现的:
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) {
}
});
修改 数据库结构如下所示:
{
"Scores" : {
"id1" : {
"fullName" : "Robert",
"score" : 96,
"username" : "rob"
},
"id2" : {
"fullName" : "Michael",
"score" : 87,
"username" : "mike"
},
"id3" : {
"fullName" : "Bobby",
"score" : 150,
"username" : "bob"
}
}
}
提前致谢。
概要
使用 wilkas&#39; 回答我来到以下代码段以获得想要的结果:
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) {
}
});
当多个条目的fullName
等于'Bobby'
时,它会很有效。
答案 0 :(得分:1)
由于您在Scores
下添加了监听器,因此您的孩子为id1
,id2
和id3
。通过添加查询.orderByChild("fullName").equalTo("Bobby")
,您可以按子进程过滤并获得一个结果id3
。因此,您的第一个datasnapshot
指的是一个孩子id3
(如果他们的名字与“Bobby”相同,可能会有更多的孩子)。
为了获取用户名,你需要迭代每个收到的孩子(正如你所做的那样) - 在这种情况下只迭代一个孩子 - 然后得到那个迭代孩子的孩子username
。
由于您知道每个idX
都包含以下子项:username
,score
,fullName
。您可以轻松提取username
,如下所示(在您的情况下,snap
是对儿童id3
的引用):
String username = (String) snap.child("username").getValue();
String fullName = (String) snap.child("fullName").getValue();
long score = (long) snap.child("score").getValue();
此外,您也可以按如下方式检索id
:
String recordId = snap.getKey();
在内部迭代中,您还可以获得username
,如下所示:
String recordId = snap.getKey();
String username = (String) dataSnapshot.child(recordId).child("username").getValue();