如何在 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)
以查看是否出现问题。
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)
以查看是否出现问题。