我正在尝试在 Android 上制作应用程序,我是初学者。
我尝试增加产品的“库存”,但我的以下代码不可靠。我在设备上遇到了连接问题,并且“库存”没有正确增加。我如何将它作为 transaction 执行?我找不到详尽的文档。
final HashMap<String, BigDecimal> detalle = new HashMap<String, BigDecimal>();
Query query = mDatabase.child("COMPRAS").child(key).child("COMPRASPRODUCTO");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()){
CompraProducto producto = ds.getValue(CompraProducto.class);
detalle.put(producto.getId(),new BigDecimal(producto.getCantidad()));
}
for (String key : detalle.keySet()) {
Query queryp = mDatabase.child("PRODUCTO").child(key);
queryp.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot data) {
Producto p = data.getValue(Producto.class);
try{
stockOriginal = new BigDecimal(p.getStock());
mProductoProvider = new productoProvider();
mProductoProvider.refreshStock(p.getCodigo(), stockOriginal.add(detalle.get(p.getCodigo())).toString()).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
});
}catch(Exception e){
Toast.makeText(comprarProducto.this, "Producto " + data.getKey() + " no existe.", Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
谢谢。
答案 0 :(得分:0)
我正在使用 updateChildren 和 ServerValue.increment
使用这些路径,您可以通过一次调用 updateChildren() 对 JSON 树中的多个位置执行同时更新,例如本示例如何在两个位置创建新帖子。以这种方式进行的同步更新是原子性的:要么所有更新成功,要么所有更新失败。
final Map<String, Object> productUpdates = new HashMap<>();
Query query = mDatabase.child("COMPRAS").child(key).child("COMPRASPRODUCTO");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()){
System.out.println("---" + ds.getKey());
CompraProducto producto = ds.getValue(CompraProducto.class);
productUpdates.put("/PRODUCTO/" + ds.getKey() +"/stock", ServerValue.increment(producto.getCantidad()));
}
System.out.println("==============");
if(!productUpdates.isEmpty()) {
mDatabase.updateChildren(productUpdates, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
if (databaseError == null) {
mCompraProvider.actualizar(key, inputProveedor.getText().toString(), inputFecha.getText().toString(), "PENDIENTE").addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(comprarProducto.this, "Compra del proveedor " + inputProveedor.getText().toString() + " guardada correctamente.", Toast.LENGTH_SHORT).show();
}
});
System.out.println("onComplete: success");
} else {
System.out.println("onComplete: fail" + databaseError.toException());
}
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});