[英]Firebase addListenerForSingleValueEvent wont work when for loop is added
[英]How to make addListenerForSingleValueEvent to work in loop?
我正在嘗試根據購物車中存在的項目數量訪問 addListenerForSingleValueEvent 特定次數,但由於它只聽一次我無法從數據庫中獲取信息(即我需要獲取可用的每個產品,但它只獲取一次,並為購物車中的 rest 應用相同的可用價值)
私人無效updateAdminView(列表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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.