有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    对Firebase数据库执行查询时,可能会出现多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果列表

    你的onDataChange需要通过循环dataSnapshot.getChildren()来处理这个列表。所以如果你真的只期望一个结果,那就是:

    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            setValue(snapshot);
        }
    }