如何在Firebase Realtime Databse中减去两个不同的节点子值? [英] How to Subtract two different node child values in Firebase Realtime Databse?
问题描述
我正在创建一个食品订购应用程序,为此我将食品名称保存到了食品唯一ID中.因此,我创建了 Item Details 作为一个节点,在此节点中具有 shopuniqueID 作为子节点,在此节点中具有食物 uniqueID
此ID包含食品详细信息,例如折扣,商品名称,价格,折扣如果用户预订食品,则将其保存为以下格式
,如果在用户选择的数量要从项目总数量中删除后客户确认了食品订单,如何删除两个不同节点中的两个不同值?
I'm creating a Food ordering app.for that I'm saving the food names into the Food unique ID. So I created Item Details as a node, in this node has shopuniqueID as a child node, in this node has food uniqueID
this ID contains food details such as discount,itemname,price,discount If the User book the foods, which will be saved as below format
, If the customer confirms the food order after that user-selected quantity wants to delete from total item quantity, How can I delete two different values which are in the two different nodes?
这是我尝试过的编码
This is my tried coding
btnorder=findViewById(R.id.qrbillid);
databaseReference= FirebaseDatabase.getInstance().getReference("User Booking").child(UserID).child(shopid);
dbrefcheck=FirebaseDatabase.getInstance().getReference("Item Details").child(shopid);
btnorder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot1:dataSnapshot.getChildren())
{
SelectedItems ui=dataSnapshot1.getValue(SelectedItems.class);
final String itemid=ui.getItemid();
final String Stritemselectedqty=ui.getItemid();
final String name=ui.getItemname();
///////////////////----find the user selection----////////////////////
dbrefcheck.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot dataSnapshot2:dataSnapshot.getChildren())
{
UploadItem uploadItem=dataSnapshot2.getValue(UploadItem.class);
String uploadItemID=uploadItem.getKey();
String StrTotalqty=uploadItem.getQuantity();
if(itemid.equals(uploadItemID))
{
// do the mathematical operation
int totalqty=Integer.valueOf(StrTotalqty);
int selectedqty=Integer.valueOf(Stritemselectedqty);
int finalquality=totalqty-selectedqty;
Toast.makeText(MyBookedItems.this, ""+name+" ", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
///////////////////----find the user selection----////////////////////
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
推荐答案
如果我们想在两个节点子值之间进行数学运算,则不能直接在Firebase Realtime数据库中执行.
If We want to do mathematical operations between two node child values, We can't directly do that in Firebase Realtime Database.
- 从Firebase检索值
-
之后,进行修改,然后再次上传.
- Retrieve the value from the Firebase
after that do the modification and again upload it.
private void updateQuantity(最终字符串itemid,最终字符串selecteditem){
private void updateQuantity(final String itemid, final String selecteditem) {
Query query4 = dbrefcheck
.orderByChild("key") //key
.equalTo(itemid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String qty=ds.child("quantity").getValue(String.class);
int total=Integer.valueOf(qty);
int sub=Integer.valueOf(selecteditem);
int fv=total-sub;
String sfv=String.valueOf(fv);
Map<String, Object> map = new HashMap<>();
map.put("quantity", sfv);
dbrefcheck.child(itemid).updateChildren(map).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
query4.addListenerForSingleValueEvent(valueEventListener);
}
private void moveSelectedItemstoOrder(final DatabaseReference fromPath, final DatabaseReference toPath) {
final String th=toPath.push().getKey();
fromPath.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
toPath.child(th).setValue(dataSnapshot.getValue(), new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError firebaseError, DatabaseReference firebase) {
if (firebaseError != null) {
Toast.makeText(MyBookedItems.this, "Try again", Toast.LENGTH_SHORT).show();
} else {
StoreBookingDetails(th);
}
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void DeleteValuefromSelectedItems() {
databaseReference.setValue(null).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
private void StoreBookingDetails(final String keytostore) {
//////////////////------------retrive data-------------//////////////////////////////some these methods are unnecessary but i remove some code
savedata(keytostore);
//////////////////------------retrive data-------------//////////////////////////////
}
private void savedata(String keytostore) {
String status="Order Request";
// shopid ---->
BookingDetails bd=new BookingDetails(keytostore,currentdate,UserID,subtotal,status,f1,f2,f3,currentTime);
dbbookingDetails.child(keytostore).setValue(bd).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful())
{
DeleteValuefromSelectedItems();
}else
{
Toast.makeText(MyBookedItems.this, "Check the intenet connection", Toast.LENGTH_SHORT).show();
}
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
/////////////////////////////--------------------/////////////////////////////////
UserBookingDetails ubd=new UserBookingDetails(shopname,shopid,shopphnno,keytostore,UserID,subtotal,currentdate,currentTime,"Order Sent","","");
dbbookingdetailsUser.child(keytostore).setValue(ubd).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
}
}).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
AlertDialog.Builder adb = new AlertDialog.Builder(MyBookedItems.this);
adb.setTitle("Booking Successful");
adb.setPositiveButton("View History", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startActivity(new Intent(MyBookedItems.this,OrderHistory.class));
}
});
adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
adb.show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
这篇关于如何在Firebase Realtime Databse中减去两个不同的节点子值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!