【问题标题】:How to Subtract two different node child values in Firebase Realtime Databse?如何在 Firebase 实时数据库中减去两个不同的节点子值?
【发布时间】:2020-04-01 09:55:43
【问题描述】:

我正在创建一个食品订购应用程序。为此,我将食品名称保存到食品唯一 ID 中。所以我创建了 Item Details 作为一个节点,在这个节点中有 shopuniqueID 作为子节点,在这个节点中有 food uniqueID 此 ID 包含食物详细信息,如折扣、商品名称、价格、折扣 如果用户预订食物,将按以下格式保存 ,如果客户在用户选择的数量想要从总项目数量中删除之后确认食品订单,我如何删除两个不同节点中的两个不同值?

这是我尝试过的编码

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) {

                }
            });
        }
    });

【问题讨论】:

  • 如果要删除为什么需要两个节点。用户预订对您来说已经足够了。因为那个包含 itemid 和 shopid。

标签: java android firebase firebase-realtime-database


【解决方案1】:

如果我们想在两个节点子值之间进行数学运算,我们不能直接在 Firebase 实时数据库中进行。

  1. 从 Firebase 中检索值
  2. 之后进行修改并再次上传。

    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) {
    
            }
        });
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2020-05-12
    相关资源
    最近更新 更多