java orderByChild()。equalTo()没有返回id
LiveData<DataSnapshot> questBadgeData = questViewModel.getBadgeSnapshotLiveData(questViewModel.getQuestId());
Log.d("sad","score calc quest id "+questViewModel.getQuestId());
questBadgeData.observe(getViewLifecycleOwner(), new Observer<DataSnapshot>() {
@Override
public void onChanged(DataSnapshot dataSnapshot) {
String badgeID = dataSnapshot.getKey();
Log.d("sad","badge id "+badgeID);
//String icon = dataSnapshot.child("icon").getValue().toString();
//String name = dataSnapshot.child("name").getValue().toString();
//questViewModel.setBadgeData(badgeID,icon,name);
questViewModel.setBadgeData(badgeID,"dummy","dummy");
}
});
这是我的firebase数据库的结构:
@NonNull
public LiveData<DataSnapshot> getBadgeSnapshotLiveData(String qid) {
Query query = dbBadge.orderByChild("questid").equalTo(qid);
return new FirebaseQueryLiveData(query);
}
这是我的FirebaseQueryLiveData课程
public class FirebaseQueryLiveData extends LiveData<DataSnapshot> {
private static final String TAG = "FirebaseQueryLiveData";
private final Query query;
private final MyValueEventListener listener = new MyValueEventListener();
public FirebaseQueryLiveData(Query query) {
this.query = query;
}
public FirebaseQueryLiveData(DatabaseReference ref) {
this.query = ref;
}
@Override
protected void onActive() {
Log.d(TAG, "onActive");
query.addValueEventListener(listener);
}
private class MyValueEventListener implements ValueEventListener {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
setValue(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, "Can't listen to query " + query, databaseError.toException());
}
}
}
据我所知,当我打印批次id的日志时,当questid='q1'时,我应该得到'b1',但是我得到'batch'作为键
2020-06-30 17:15:21.864 29487-29487/com.example.activedash D/sad: score calc quest id q1
2020-06-30 17:15:21.916 29487-29487/com.example.activedash D/sad: badge id badge
当我只是将密钥作为child(key)而不是orderByChild()时,这很有效,但我需要通过orderByChild()获取badge的密钥
@NonNull
public LiveData<DataSnapshot> getBadgeSnapshotLiveData(String qid) {
Query query = dbBadge.child("b1");
return new FirebaseQueryLiveData(query);
}
# 1 楼答案
对Firebase数据库执行查询时,可能会出现多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果列表
你的
onDataChange
需要通过循环dataSnapshot.getChildren()
来处理这个列表。所以如果你真的只期望一个结果,那就是: