如何在 firebase 中同时更新不同节点中的多个值?

How to update multiple values in different nodes simultaneously in firebase?

Screenshot of my Database in firebase

这里我有一个名为 products 的节点。在那里,我有很多子节点。所有这些节点都有一个共同的价值,称为产品库存。我需要更新产品内所有节点的产品库存值。因为我正在开发购物应用程序,所以在 android studio (Java) 中如何做到这一点?需要帮助。

private void updateStock(String quantity, String availablestock) {

        int qty = Integer.parseInt(quantity);
        int stk_avl = Integer.parseInt(availablestock);

        int stk = stk_avl - qty;

        HashMap<String, Object> hashMap = new HashMap<>();

        hashMap.put("ProductStock", ""+stk);


        //update to database
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.child(shopUid).child("Products").child(productId)
                .updateChildren(hashMap)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        //update success
                        progressDialog.dismiss();
                        
                        Toast.makeText(CartActivity.this, "Updated...", Toast.LENGTH_SHORT).show();

                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        progressDialog.dismiss();
                        Toast.makeText(CartActivity.this, "" + e.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
    }




流程是: 用户将产品添加到购物车。在购物车中,我有 ordernow 按钮。因此,当用户现在点击订购时,他的购物车中的产品数量应该从产品节点中的产品库存值中减去。但是当此代码运行时,例如,假设我的购物车中有 5 种产品,此代码仅更新 1 种产品(购物车中最后添加的产品)的产品库存。 我怎样才能让它更新所有产品?

为了能够更新存在于特定节点下的多个子节点,您必须创建一个查询并使用 updateChildren 方法,如下所示:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = dbFirebaseDatabase.child("Users");
DatabaseReference productsRef = usersRef.child(shopUid).child("Products");
DatabaseReference additionalUserInfoRef = rootRef.child("AdditionalUserInfo");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Map<String, Object> map = new HashMap<>();
            map.put("ProductStock", newValueOfTypeInt);
            ds.getRef().updateChildren(map);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
productsRef.addListenerForSingleValueEvent(valueEventListener);

如果需要,您还可以将侦听器附加到 .updateChildren(map) 以查看是否出现问题。