gpt4 book ai didi

java - 如何使 addListenerForSingleValueEvent 在循环中工作?

转载 作者:行者123 更新时间:2023-12-01 16:18:44 27 4
gpt4 key购买 nike

我正在尝试根据购物车中存在的商品数量访问 addListenerForSingleValueEvent 特定次数,但由于它只监听一次,我无法从数据库中获取信息(即我需要获取每个产品的可用值,但仅获取一次并对购物车中存在的其余商品应用相同的可用值)

private void updateAdminView(List listOfItems) {

    final DatabaseReference cartListRef = FirebaseDatabase.getInstance().getReference().child("Cart List");
final DatabaseReference orderListRef = FirebaseDatabase.getInstance().getReference().child("Order List");

for(Cart cartItem : listOfItems)
{
final HashMap<String,Object> cartMap = new HashMap<>();
cartMap.put("pid",cartItem.getPid());
cartMap.put("name",cartItem.getName());
cartMap.put("price",cartItem.getPrice());
cartMap.put("weight",cartItem.getWeight());
cartMap.put("date",cartItem.getDate());
cartMap.put("quantity",cartItem.getQuantity());
cartMap.put("sid",cartItem.getSid());
cartMap.put("description",cartItem.getDescription());
cartMap.put("duration",cartItem.getDuration());
cartMap.put("time",cartItem.getTime());
cartMap.put("usage",cartItem.getUsage());

cartListRef.child("Admin View").child(Prevalent.currentOnlineUser.getPhone())
.child(cartItem.getPid()).updateChildren(cartMap).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(ConfirmFinalOrderActivity.this, "You can purchase more products once your order is verified", Toast.LENGTH_SHORT).show();
}
});

orderListRef.child("Admin View").child(Prevalent.currentOnlineUser.getPhone())
.child(cartItem.getPid()).updateChildren(cartMap);

final String dQuantity = cartItem.getQuantity();
final String pid = cartItem.getPid();

final DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Products").child(pid);
reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
sAvailable = Objects.requireNonNull(dataSnapshot.child("available").getValue()).toString();
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});

int quan = Integer.parseInt(dQuantity);
int Ava = Integer.parseInt(sAvailable);
int k = Ava - quan;
String d = String.valueOf(k);
reference.child("available").setValue(d).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Toast.makeText(ConfirmFinalOrderActivity.this, "Done..!", Toast.LENGTH_SHORT).show();
}
});


}


}

sAvailable 的值与第一个购物车商品相同。尽管它处于 for 循环中,但它的值并没有改变。我想获取所有购物车商品的 sAvailable 值。

最佳答案

firebase数据库读写操作是异步的,这意味着你无法立即得到结果,你的代码很容易出错,请尝试其他方式

使用一个事务批量更新所有,异步到同步考虑使用这种模式

    // outside callback
CountDownLatch countDownLatch = new CountDownLatch(1);

// in callback
countDownLatch.countDown();

// outside callback
countDownLatch.await();

// callback is invoked. do anything you want

关于java - 如何使 addListenerForSingleValueEvent 在循环中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62330336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com