【问题标题】:how can i fix this null in firebase?我怎样才能在firebase中修复这个null?
【发布时间】:2017-08-28 16:19:59
【问题描述】:

我正在尝试从 FirebaseDatabase 导入数据,它正在工作但不适用于此类,当我尝试获取它的数据时,它会给我一个空值,这是它称为 RoomsAvailable 的类,谁能告诉我为什么我得到空值,我该如何解决它。

public class RoomsAvailable {

private int onePerson;
private int twoPerson;
private int threePerson;
private int fourPerson;



public RoomsAvailable() {

}
public RoomsAvailable(int onePerson, int twoPerson, int threePerson, int fourPerson) {
    this.onePerson = onePerson;
    this.twoPerson = twoPerson;
    this.threePerson = threePerson;
    this.fourPerson = fourPerson;
}

public int getOnePerson() {
    return onePerson;
}

public void setOnePerson(int onePerson) {
    this.onePerson = onePerson;
}

public int getTwoPerson() {
    return twoPerson;
}

public void setTwoPerson(int twoPerson) {
    this.twoPerson = twoPerson;
}

public int getThreePerson() {
    return threePerson;
}

public void setThreePerson(int threePerson) {
    this.threePerson = threePerson;
}

public int getFourPerson() {
    return fourPerson;
}

public void setFourPerson(int fourPerson) {
    this.fourPerson = fourPerson;
}


@Override
public String toString() {
    return "RoomsAvailable{" +
            "onePerson=" + onePerson +
            ", twoPerson=" + twoPerson +
            ", threePerson=" + threePerson +
            ", fourPerson=" + fourPerson +
            '}';
}

}

这是我的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final List<Hotel> hotelList = new ArrayList<>();
    mDatabaseReference = FirebaseDatabase.getInstance().getReference();
    mDatabaseReference.child("0/"+"hotels").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (int i = 0; i < dataSnapshot.getChildrenCount(); i++) {
                Hotel hotel = dataSnapshot.child(i + "").getValue(Hotel.class);
                hotelList.add(hotel);

                Log.d(TAG, hotel.getId() + "\n");
                Log.d(TAG, hotel.getCityId() + "\n");
                Log.d(TAG, hotel.getName() + "\n");


                Log.d(TAG, hotel.getRoomsAvailable() + "\n");

            }
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.cities_recyclerview);
            recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
            RecyclerView.Adapter adapter = new HotelAdapter(getApplicationContext(), hotelList);
            recyclerView.setAdapter(adapter);
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "onCreate:Failed to read hotelList.", databaseError.toException());

        }



    });


}

这是我的 Firebase 数据库

问:有什么问题?

问:我该如何解决?

【问题讨论】:

  • 请向我们展示您的Hotel 课程...

标签: java android json firebase firebase-realtime-database


【解决方案1】:

您总是得到null,因为您在onDataChange() 方法之外声明了hotelList。这是由于此方法的异步行为而发生的,甚至在您将这些酒店添加到列表之前就会调用该方法。所以为了解决这个问题,请将列表的声明移到onDataChange() 内,或者如果你想在外面使用它,请参阅我的答案表格post

您的代码应如下所示:

mDatabaseReference.child("0/"+"hotels").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        final List<Hotel> hotelList = new ArrayList<>();
        for (int i = 0; i < dataSnapshot.getChildrenCount(); i++) {
            Hotel hotel = dataSnapshot.child(i + "").getValue(Hotel.class);
            hotelList.add(hotel);

            Log.d(TAG, hotel.getId() + "\n");
            Log.d(TAG, hotel.getCityId() + "\n");
            Log.d(TAG, hotel.getName() + "\n");
            Log.d(TAG, hotel.getRoomsAvailable() + "\n");
        }
        Log.d("TAG", hotelList);
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.cities_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        RecyclerView.Adapter adapter = new HotelAdapter(getApplicationContext(), hotelList);
        recyclerView.setAdapter(adapter);
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCreate:Failed to read hotelList.", databaseError.toException());

    }
});

【讨论】:

    【解决方案2】:

    你为什么不这样尝试

    @Override
     protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final List<Hotel> hotelList = new ArrayList<>();
    mDatabaseReference = FirebaseDatabase.getInstance().getReference();
    mDatabaseReference.child("0/"+"hotels").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
    
                hotelList = (List<Hotel>) dataSnapshot.getValue(Hotel.class);
    
            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.cities_recyclerview);
            recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
            RecyclerView.Adapter adapter = new HotelAdapter(getApplicationContext(), hotelList);
            recyclerView.setAdapter(adapter);
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.w(TAG, "onCreate:Failed to read hotelList.", databaseError.toException());
    
        }
    
    
    
    });
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多