Как вычесть два разных дочерних значения узла в Firebase Realtime Databse? - PullRequest
0 голосов
/ 01 апреля 2020

Я создаю приложение для заказа продуктов питания. Для этого я сохраняю названия продуктов в уникальный идентификатор Food. Поэтому я создал Сведения об элементе как узел, в этом узле shopuniqueID как дочерний узел, в этом узле есть еда uniqueID items details
этот идентификатор содержит данные о продуктах питания, такие как скидка, наименование товара, цена, скидка, если пользователь заказывает продукты, которые будут сохранены в следующем формате user booking, если клиент подтверждает заказ на питание после того, как это выбранное пользователем количество хочет удалить из общего количества товара, как я могу удалить два разных значения, которые находятся в двух разных узлах?

Это мое проверенное кодирование

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

                }
            });
        }
    });

1 Ответ

0 голосов
/ 03 апреля 2020

Если мы хотим выполнить математические операции между двумя дочерними значениями узла, мы не можем напрямую сделать это в базе данных Firebase Realtime.

  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) {
    
            }
        });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...