¿Existe alguna manera de guardar datos de una base de datos en tiempo real de Firebase sin obtener una variable nula?
Tengo una base de datos en tiempo real de Firebase y me gustaría recuperar algunos datos y ponerlos en un ArrayList.
ArrayList
List
DatabaseReference shopRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shop);
itemsArray = new ArrayList<>();
shopRef = FirebaseDatabase.getInstance().getReference();
Query query = shopRef.child("shop");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Item item = new Item();
item.setLogo(snapshot.child("Logo").getValue().toString());
item.setName(snapshot.child("Name").getValue().toString());
item.setDescription(snapshot.child("Description").getValue().toString());
itemsArray.add(item); //itemsArray está lleno
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
itemsList = itemsArray; // itemsArray es nulo
}
El problema es que después del listener, parece fácil de arreglar, pero no entiendo por qué el ArrayList es nulo.
El base de datos funciona correctamente.
La clase Item funciona correctamente.
davy.ai
El problema con el código anterior es que el ArrayList
itemsArray
se está llenando de forma asíncrona dentro delValueEventListener
. Por lo tanto, cuando se ejecuta la líneaitemsList = itemsArray
, es probable queitemsArray
siga estando vacío/nulo ya que el listener aún no ha terminado de obtener y llenar los datos.Para resolver este problema, una opción es mover cualquier operación que requiera que
itemsArray
esté lleno dentro del métodoonDataChange
del listener. Aquí tienes un ejemplo:En este ejemplo,
itemsList
se crea dentro del métodoonDataChange
después de queitemsArray
se haya llenado. Cualquier otra operación que requiera queitemsArray
esté lleno también debe ser movida dentro de este método.