通过从子节点检索数据进行计算在 Android Studio/Firebase 中根本不起作用

Do calculation by retrieving data from Child Node is not working at all in Android Studio/Firebase

我在通过从 Child Nod 检​​索数据进行减法计算时遇到问题。正如您在下面看到我的布局,我想要做的是 通过计算每日卡路里值减去总卡路里来获得剩余卡路里值,并将剩余卡路里显示到 TextView

我怀疑减法部分(下面的代码)的计算根本不起作用,因为我试图将 remainingCount/remainingCalorie 值放入 firebase 但没有任何反应。

 //CALCULATE AND DISPLAY REMAINING CALORIE
    private void updateRemainingKcal(final double finalCount) {

        DatabaseReference userRecord = FirebaseDatabase.getInstance().getReference();
        DatabaseReference userReference = userRecord.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        userReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                double remainingCount = 0;

                for (DataSnapshot userChild: dataSnapshot.getChildren()) {
                    for (DataSnapshot recordSnapshot: userChild.getChildren()) {
                        double userCalorie = Double.valueOf(recordSnapshot.child("daily calorie").getValue(String.class));
                        remainingCount = userCalorie - finalCount;
                        userRemainingCalorie.setText((remainingCount  +"kcal"));

                        myHistoryRef = FirebaseDatabase.getInstance().
                                getReference("History").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .child(date_record).child("Total Calorie");

                        Map<String, Object> values = new HashMap<>();
                        values.put("remainingCalorie", remainingCount);

                        myHistoryRef.updateChildren(values).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                            }
                        });
                    }
                }
                Log.d("TAG", remainingCount + "");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });
    }

这是执行此操作的相关代码,因此我需要先从用户那里检索“每日卡路里”,然后我可以减去每日卡路里(所需 Kcal)- 消耗的总卡路里(Total Kcal)= 剩余卡路里(剩余千卡):



        //**********************DATABASE REFERENCE FOR USER REQUIRED CALORIE***************************//
        requiredCalorieRef = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        requiredCalorieRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


                String userCalorieSuggestion = String.valueOf((dataSnapshot.child("daily calorie").getValue()));
                userRequiredCalorie.setText((userCalorieSuggestion  +"kcal"));


            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }

        });

    //CALCULATE AND DISPLAY TOTAL CALORIE ACCORDING TO DATE
    private void updateTotalCalorie(final String date_n) {

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference nameRef = rootRef.child("UsersRecords").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(date_record);
        nameRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                double count = 0;
                for (DataSnapshot foodTypeSnapshot: dataSnapshot.getChildren()) {
                    for (DataSnapshot recordSnapshot: foodTypeSnapshot.getChildren()) {
                        double foodCalorie = Double.valueOf(recordSnapshot.child("foodCalorie").getValue(String.class));
                        count = count + foodCalorie;
                        userTotalCalorie.setText((count  +"kcal"));


                        myHistoryRef = FirebaseDatabase.getInstance().
                                getReference("History").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .child(date_record).child("Total Calorie");

                        Map<String, Object> values = new HashMap<>();
                        values.put("totalCalorie", count);
                        values.put("Date Consume", date_n);

                        final double finalCount = count;
                        myHistoryRef.updateChildren(values).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                updateRemainingKcal(finalCount);
                            }
                        });


                    }
                }
                Log.d("TAG", count + "");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });



    }

    //CALCULATE AND DISPLAY REMAINING CALORIE
    private void updateRemainingKcal(final double finalCount) {

        DatabaseReference userRecord = FirebaseDatabase.getInstance().getReference();
        DatabaseReference userReference = userRecord.child("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
        userReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                double remainingCount = 0;

                for (DataSnapshot userChild: dataSnapshot.getChildren()) {
                    for (DataSnapshot recordSnapshot: userChild.getChildren()) {
                        double userCalorie = Double.valueOf(recordSnapshot.child("daily calorie").getValue(String.class));
                        remainingCount = userCalorie - finalCount;
                        userRemainingCalorie.setText((remainingCount  +"kcal"));

                        myHistoryRef = FirebaseDatabase.getInstance().
                                getReference("History").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .child(date_record).child("Total Calorie");

                        Map<String, Object> values = new HashMap<>();
                        values.put("remainingCalorie", remainingCount);

                        myHistoryRef.updateChildren(values).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                            }
                        });
                    }
                }
                Log.d("TAG", remainingCount + "");
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });
    }




这是我的 firebase 的样子 - 在 History 节点上根本没有 RemainingCalorie 节点:

我如何解决这个问题尽管我知道这个问题。我尝试了几种方法,但都无法解决这个代码问题。

我已经解决了我自己的问题。谢谢,终于搞定了。对于将来遇到同样问题的人来说,这是正确的代码:

private void updateRemaining(final int finalCount) {
    userDatabase = FirebaseDatabase.getInstance().getReference("Users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
    userDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String user = String.valueOf((dataSnapshot.child("daily calorie").getValue()));
            int dailyCalorie = Integer.parseInt(user);
            int remainingCalorie = dailyCalorie-finalCount;
            userRemainingCalorie.setText((remainingCalorie  +"kcal"));

        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }

    });
}

这是截图