我从Firebase数据库获取数据时遇到问题。
仅当参与子文档中存在当前用户ID时,我才需要收集数据并将其附加到数组中。

请查看数据库结构:
java - 使用Java在Android Studio中查询Firebase数据库-LMLPHP

这是我试图用来解决的代码。

private DatabaseReference mDB = FirebaseDatabase.getInstance().getReference().child("events");
private FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
private String userid = user.getUid();

mDB.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                try{
                    for (DataSnapshot chidSnap : dataSnapshot.getChildren()) {

                        for(DataSnapshot participant : chidSnap.child("participants").getChildren()){

                            String participantKey = participant.getKey();
                            Log.d(TAG, "onDataChange: " + participantKey);

                            String participantId = (String) participant.child(participantKey).getValue();
                            Log.d(TAG, "onDataChange: " + participantId);

                            if(participantId.equals(userid)){

                                mEventKeys.add(chidSnap.getKey()); //displays the key for the node
                                mEventNames.add((String) chidSnap.child("event_name").getValue());
                                mEventShortDescriptions.add((String) chidSnap.child("event_name").getValue());
                                mEventLongDescriptions.add((String) chidSnap.child("event_name").getValue());
                                mEventCityLocations.add((String) chidSnap.child("event_name").getValue());
                                mEventDates.add((String) chidSnap.child("event_name").getValue());
                                mEventHours.add((String) chidSnap.child("event_name").getValue());
                            }
                        }
                    }
                }catch (Exception e){
                    Log.d(TAG, "onDataChange: " + e.toString());
                }



                initRecyclerView(recyclerView);
            }



我正在尝试获取单个参与者的密钥(并且我成功地做到了),然后插入下载的密钥以查询密钥的值。当我尝试获取特定键的值时,我收到的是Null值。

你们可以帮忙吗?

另外,如果您对我如何改善从Firebase的数据下载有一些建议,我也很乐意看到它们!我觉得我的方法不是最理想的。

最佳答案

无需获取密钥并在您的参考中使用,您可以像下面的代码行那样简单地循环两次:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference eventsRef = rootRef.child("events");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
            DataSnapshot participantsSnapshot = snapshot.child("participants");
            for(DataSnapshot ds : participantsSnapshot.getChildren()) {
                String uid = ds.getValue(String.class);
                Log.d(TAG, uid);
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
eventsRef.addListenerForSingleValueEvent(valueEventListener);


logcat中的结果将是participants数组中存在的所有uid。

09-26 22:29
查看更多