从Firebase RealtimeDatabase(Android、Java)收集数据时出现问题
从Firebase上的节点收集数据时出现问题。我得到了一个名为从Firebase RealtimeDatabase(Android、Java)收集数据时出现问题,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,从Firebase上的节点收集数据时出现问题。我得到了一个名为stockBuy的变量,我已经在调试模式下运行了我的应用程序,它正确地获取了值,但是在onDataChange()中,我的变量变成了1,而不是firebase+1中的值,就像我在这一行中看到的那样stockBuy=stockBuy+1 在这里你可以看到我的代码 private void deleteProduct(final int position){ mDataBase3 = FirebaseDatabase.getIns
stockBuy
的变量,我已经在调试模式下运行了我的应用程序,它正确地获取了值,但是在onDataChange()
中,我的变量变成了1,而不是firebase+1中的值,就像我在这一行中看到的那样stockBuy=stockBuy+1代码>
在这里你可以看到我的代码
private void deleteProduct(final int position){
mDataBase3 = FirebaseDatabase.getInstance().getReference().child("Products");
mDataBase4 = FirebaseDatabase.getInstance().getReference().child("Wishes");
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Products").child(MainActivity.carrito.get(position).getId());
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
stockBuy = Integer.parseInt(dataSnapshot.child("stock").getValue().toString());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
stockBuy = stockBuy + 1;
mDataBase3.child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);
mDataBase4.child(userUid).child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);
MainActivity.carrito.remove(position);
this.cAdapter.notifyDataSetChanged();
}
数据是从Firebase异步加载的,这意味着onDataChange
的执行可能比您预期的要晚得多。如果您放置断点或添加一些日志记录,您可以看到stockBuy=stockBuy+1
在调用stockBuy=Integer.parseInt
之前运行,这就解释了问题
任何需要数据库数据的代码都需要在onDataChange
中,或者从那里调用。因此,最简单的解决方法是:
private void deleteProduct(final int position){
mDataBase3 = FirebaseDatabase.getInstance().getReference().child("Products");
mDataBase4 = FirebaseDatabase.getInstance().getReference().child("Wishes");
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Products").child(MainActivity.carrito.get(position).getId());
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
stockBuy = Integer.parseInt(dataSnapshot.child("stock").getValue().toString());
stockBuy = stockBuy + 1;
mDataBase3.child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);
mDataBase4.child(userUid).child(MainActivity.carrito.get(position).getId()).child("stock").setValue(stockBuy);
MainActivity.carrito.remove(position);
this.cAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
throw error.toException();
}
});
}
另见: