Java 根据某个对象提供的数据从某个对象检索Firebase数据

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");

我是Android Firebase的新手。我有一个应用程序,在其中我将所有酒店的id保存在一个对象中。我只有id,所以基于这些id,我想检索其他对象中的所有信息。 到目前为止我都试过了

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
    保留为空,因为您可能会在那里隐藏重要的错误消息。我在这里以最简单的方式实现了它

请将您的数据库结构添加为JSON文件或至少作为屏幕截图,并指出您想要获取的确切数据。请检查编辑。我已附上db的屏幕截图。我拥有所有国家/地区对象中的所有id,基于这些id,我拥有酒店对象中的数据。请不要在您的问题中包含图像或链接。将代码和结构作为文本包含。要获取Firebase结构,请使用Firebase控制台->导出JSON,然后复制并粘贴结构片段。看见