问题
I am having problem reading data from Firebase. But, I just can get single data but, I need to get list of that data. Since it is my first work using Firebase. I have only used SQL in the past.
Here is My Firebase Structure.
"UserEO" : {
"RZ5piQEWcoSonDYPu3NSKBrXTbW2" : {
"-LdK1ZgjaKvXFjUeq-Yj" : {
"keyUID" : "RZ5piQEWcoSonDYPu3NSKBrXTbW2"
},
"-LdK264lPX9eBBzYe0m4" : {
"keyUID" : "RZ5piQEWcoSonDYPu3NSKBrXTbW2"
}
}
},
"eventOrganizer" : {
"-LdK1ZgjaKvXFjUeq-Yj" : {
"deskripsi" : "USMA is .. ",
"namaGrup" : "UKM USMA",
"website" : "ukm.usma.blogspot.com"
},
"-LdK264lPX9eBBzYe0m4" : {
"deskripsi" : "LPM KOMPEN is ..",
"namaGrup" : "UKM LPM KOMPEN",
"website" : ""
} },
"users" : {
"RZ5piQEWcoSonDYPu3NSKBrXTbW2" : {
"email" : "kiranana@gmail.com",
"nama" : "kirana"
}
}
Here is my code, I want to select group eventOrganizer that user joining.
userId=auth.getCurrentUser().getUid();
recyclerView = (RecyclerView) findViewById(R.id.rv_grupeo);
layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
grupEOModelList = new ArrayList<>();
adapter = new GrupEOAdapter(grupEOModelList,GrupEO.this);
recyclerView.setAdapter(adapter);
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("UserEO").child(userId);
databaseReference.addValueEventListener(valueEventListenerAdmin);
}
ValueEventListener valueEventListenerAdmin = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String getKey = null;
if (dataSnapshot.exists()){
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
getKey = snapshot.getKey();
}
final DatabaseReference databaseReferenceEO = FirebaseDatabase.getInstance().getReference("eventOrganizer");
databaseReferenceEO.orderByKey().equalTo(getKey).addValueEventListener(valueEventListener);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
grupEOModelList.clear();
if (dataSnapshot.exists()){
for (DataSnapshot snapshot : dataSnapshot.getChildren()){
GrupEOModel grupEOModel = snapshot.getValue(GrupEOModel.class);
grupEOModelList.add(grupEOModel);
}
adapter.notifyDataSetChanged();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};}
Thanks in advance.
回答1:
I guess the problem is here:
final DatabaseReference databaseReferenceEO = FirebaseDatabase.getInstance().getReference("eventOrganizer");
databaseReferenceEO.orderByKey().equalTo(getKey).addValueEventListener(valueEventListener);
I don't know it it's a good ideia to embedd a valueListener inside OnDataChange, I would suggest you remove this and work with callbacks. Just convert UserEO in a list using this:
ArrayList<UserEO> td = (ArrayList<UserEO>) dataSnapshot.getValue();
return it in a callback, then you can call for each key an method with your valueEventListener.
I also would like to suggest you a simplification. You can add another child inside users like, events: {"LdK1ZgjaKvXFjUeq", "-LdK264lPX9eBBzYe0m4"}, so each user will have a list of events key, pretty straightfoward.
The key of a good use of NoSQL is to design well your data, optimizing it for queries, I can see you're still thinking like SQL tables, but it's ok since you're still learning.
回答2:
you can get list of data like this :-
ArrayList<Chat> mChat = new ArrayList<>();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference(chatTableName);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mChat.clear();
Chat chat = null;
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
chat = snapshot.getValue(Chat.class);
mChat.add(chat);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
来源:https://stackoverflow.com/questions/55872600/get-data-from-firebase-realtime-between-table-to-recycler-view