Выполнение расчетов путем извлечения данных из дочернего узла вообще не работает в Android Studio / Firebase - PullRequest
0 голосов
/ 13 октября 2019

У меня проблема с вычитанием вычислений путем извлечения данных из Child Nod. Как вы можете видеть из моего макета ниже, я хочу получить значение оставшегося ккал путем вычисления значения ежедневного ккал минус общий ккал и отобразить оставшийся ккал в TextView .

layout

Я подозревал, что вычисление для части вычитания (код ниже) вообще не работает, так как я пытался поместить значение ОстальноеCЦвет / ОстатокКалори в базу данных 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();
            }
        });
    }

Это релевантный код для выполнения этой операции, при котором мне сначала нужно получить «суточную калорию» от пользователя, затем я могу сделать вычитание суточной калории (требуется ккал) - общее потребление калорий (всего ккал)) = Оставшаяся калория (Оставшаяся ккал):



        //**********************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();
            }
        });
    }




Это моя база данных выглядит так: на узле истории вообще нет узла RemainingCalorie: firebase

Как я могу решить эту проблему несмотря на то, что знаю проблему. Я пробовал несколько способов, но ничто не могло помочь решить эту проблему кода.

1 Ответ

1 голос
/ 13 октября 2019

Я решил свою проблему. Спасибо, наконец-то сделал это. Это правильный код для тех, у кого такая же проблема в будущем:

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

    });
}

Это снимок экрана enter image description here

...