当前位置: 首页 > 知识库问答 >
问题:

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

葛哲彦
2023-03-14

firebase中我的数据库截图

这里我有一个叫做产品的节点。在那里,我有许多子节点。所有这些节点都有一个共同的值叫做产品库存。我需要更新产品内部所有节点的产品库存值。我如何在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按钮。因此,当用户现在单击order时,应该从products节点中的product stock value中减去购物车中的产品数量。但是当这段代码运行时,例如,假设购物车中有5种产品,这段代码只更新了1种产品(购物车中最后添加的产品)的产品库存。我怎样才能让它更新所有的产品?

共有1个答案

督宏旷
2023-03-14

为了能够更新特定节点下存在的多个子节点,您必须创建一个查询并使用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);

如果需要,还可以将侦听器附加到。更新儿童(地图),查看是否出现问题。

 类似资料:
  • 我刚刚开始学习如何使用XML数据格式,并且已经在更新一些数据上陷入了困境。我真的,真的很感谢有人帮我解决这个问题,因为我完全不知道怎么处理这样的问题。 生成一些示例数据的代码: 现在困难的部分来了... 我需要更新“value”节点的值,其中“key”节点的值=“abc”在同一个“parameter”节点中。 正如您所看到的,我的xml中有几个“参数”节点,这些节点没有我可以用来区分它们和确定应该

  • 但它没有提供所需的产出。它给出的输出像 我是XSL的新手。有谁能帮我解决这个问题吗?

  • 我试图找到这个问题的答案,但在kubernetes文档或任何问答论坛中都找不到。 我有一个运行有4个节点的kubernetes集群。是否可以创建第二个集群,重用前一个集群中的一个或多个节点?或者一个节点被限制在单个kubernetes集群中? 我正在使用RKE(用于部署k8集群的牧场工具)运行实际的集群,我发现这个问题让我怀疑这种可能性。 感谢您的澄清。

  • 我找到了几个关于如何修改XML文件中的某些文本的示例。但我的问题是存在重复的节点,就像下面的例子中节点Id出现了几次。我想用其他东西修改orgNumber值,但我没有找到正确的ID。如有任何意见,将不胜感激。

  • 我在kafka-连接中创建了两个kafka连接器,它们使用相同的连接器类,但它们听的主题不同。 当我在节点上启动进程时,两个连接器最终都会在此进程上创建任务。但是,我希望一个节点只处理一个连接器/主题。如何将主题/连接器限制为单个节点?我在connect-distributed.properties中没有看到任何配置,其中进程可以指定使用哪个连接器。 谢谢。

  • 问题内容: 我有表SQLite数据库和列,,。行数不断变化(可能增加或减少)。如果我知道每一行的值和行数,是否可以执行一次SQL查询以根据ID更新所有具有不同值的和字段? 例如: SQL查询伪代码: 和是存储和字段的新值的数组。 如果,例如,和包含以下值: …然后查询后的数据库应如下所示: 这可能吗?我现在正在为每个查询更新一行,但是随着行数的增加,它将需要数百个查询。顺便说一下,我正在AIR中做