【问题标题】:How to update multiple values in different nodes simultaneously in firebase?如何在firebase中同时更新不同节点中的多个值?
【发布时间】:2022-01-20 16:16:55
【问题描述】:

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 个产品的产品库存(购物车中最后添加的产品)。 如何让它更新所有产品?

【问题讨论】:

标签: java android firebase firebase-realtime-database google-cloud-platform


【解决方案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) 上附加一个侦听器以查看是否有问题。

【讨论】:

  • 我试过上面的方法。但它仍然存在一些问题。它正在更新所有子值,这很好。但它正在用单个值更新所有子值(我在购物车中有 2 个产品。此代码将最新添加的产品的库存值更新为 db 中的所有产品)。如何更改它以仅使用其各自的值更新当前购物车中的产品??
  • 是的,它正在更新所有子值。这不是你想要的吗?您的问题是,如何更新不同节点中的多个值。这就是解决方案的作用。但是,如果您想为每个节点添加不同的值,那么您应该迭代所需的节点以获取这些值,然后使用上面的解决方案将每个节点更改为相应的值。不要忘记他们之间的关系。
  • 我没听懂。你能修改上面的代码吗?这对我实施会有帮助。我对此还不是很熟悉。
  • 您的问题中没有足够的信息,因此我可以从购物车中获取库存并(递减)修改产品节点中的库存。除此之外,Stack Overflow 不是代码编写服务。但是,我们愿意为您现有的代码提供帮助。您应该根据答案中的信息(提供的代码)自己尝试,如果出现其他问题,请提出另一个问题。
  • 是的,我知道了。但我正处于学习阶段。所以我对这些代码不太了解。为了迭代节点,我如何在其中使用 for 循环。下面是我的数据库的结构,或者你可以在开始时参考附图和问题。用户:UID:产品:(在产品下我有一个产品列表。每个产品是一个节点。节点名称是我用作产品ID的时间戳)12334566:(这是一个产品)----(产品库存) 与上述结构一样,我有一些产品。在什么基础上我可以迭代得到我的正确结果....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多