Java 根据某个对象提供的数据从某个对象检索Firebase数据
我是Android Firebase的新手。我有一个应用程序,在其中我将所有酒店的id保存在一个对象中。我只有id,所以基于这些id,我想检索其他对象中的所有信息。 到目前为止我都试过了Java 根据某个对象提供的数据从某个对象检索Firebase数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我是Android Firebase的新手。我有一个应用程序,在其中我将所有酒店的id保存在一个对象中。我只有id,所以基于这些id,我想检索其他对象中的所有信息。 到目前为止我都试过了 reference=FirebaseDatabase.getInstance().getReference().child(getResources().getString(R.string.all_countries)).child(country).child(city).child("Hotel");
reference=FirebaseDatabase.getInstance().getReference().child(getResources().getString(R.string.all_countries)).child(country).child(city).child("Hotel");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
hotels=new ArrayList<>();
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
String id=dataSnapshot1.getKey();
hotelIDs.add(id);
reference1=FirebaseDatabase.getInstance().getReference().child("Hotel").child(id);
reference1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Hotel hotel=dataSnapshot.getValue(Hotel.class);
hotels.add(hotel);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
// }
hotelsAdapter=new HotelsAdapterUser(hotels,UserViewHotels.this,"Hotel");
hotelsRV.setAdapter(hotelsAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.e("iamhere",databaseError.getMessage());
}
});
reference=FirebaseDatabase.getInstance().getReference().child(getResources().getString(R.string.all_countries)).child(country.child(city.child)(“酒店”);
addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
hotels=新ArrayList();
对于(DataSnapshot dataSnapshot1:DataSnapshot.getChildren()){
String id=dataSnapshot1.getKey();
hotelIDs.add(id);
reference1=FirebaseDatabase.getInstance().getReference().child(“酒店”).child(id);
reference1.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
Hotel Hotel=dataSnapshot.getValue(Hotel.class);
添加(酒店);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
// }
hotelsAdapter=newhotelsadapterUser(hotels,UserViewHotels.this,“Hotel”);
hotelsRV.setAdapter(hotelsAdapter);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.e(“iamhere”,databaseError.getMessage());
}
});
我在HotelID数组列表中有所有id,基于此,当我尝试获取数据时,我的适配器在设置hotels数组列表之前正在调用,这意味着我没有获取任何数据。请帮助最简单的修复方法是在每次将酒店添加到列表时通知适配器:
reference1.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Hotel hotel=dataSnapshot.getValue(Hotel.class);
hotels.add(hotel);
adapter.notifyDataSetChanged()
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
我在这里做了一些修改:
- 使用
,这样我们就不会让侦听器保持连接。使用原始代码,如果您对数据库中的酒店进行了更改,则该酒店的第二个副本将添加到列表中addListenerForSingleValueEvent
- 不要将
保留为空,因为您可能会在那里隐藏重要的错误消息。我在这里以最简单的方式实现了它onCancelled