有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

Database Structure

我是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());

        }
    });

我在HotelID数组列表中有所有id,基于此,当我尝试获取数据时,我的适配器在设置hotels数组列表之前正在调用,这意味着我没有获取任何数据。请帮忙


共 (1) 个答案

  1. # 1 楼答案

    最简单的修复方法是,每次将酒店添加到列表时,只需通知适配器:

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