我从Firebase数据库获取数据时遇到问题。
仅当参与子文档中存在当前用户ID时,我才需要收集数据并将其附加到数组中。
请查看数据库结构:
这是我试图用来解决的代码。
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。