【问题标题】:How to make addListenerForSingleValueEvent to work in loop?如何使 addListenerForSingleValueEvent 循环工作?
【发布时间】:2020-06-11 17:41:48
【问题描述】:

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

private void updateAdminView(List ofItems) {

    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 值。

【问题讨论】:

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


    【解决方案1】:

    firebase数据库读写操作是异步的,不能马上得到结果,代码容易出错,换个方式试试

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

        // outside callback
        CountDownLatch countDownLatch = new CountDownLatch(1);
    
        // in callback
        countDownLatch.countDown();
    
        // outside callback
        countDownLatch.await();
    
        // callback is invoked. do anything you want
    

    【讨论】:

    • 你能说其他方法吗?我想获取所有 cartItem 的 sAvailable 值。请帮忙...!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2013-10-06
    相关资源
    最近更新 更多