Как я могу вычислить сумму значений внутри дочернего узла в firebase? - PullRequest
0 голосов
/ 11 октября 2019

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

У меня проблемы с подсчетом общей калорийности пищи, которую потребляет пользователь. Мне нужно рассчитать сумму только на текущую дату.

Вот как выглядит моя деятельность, как вы видите, мне нужно подвести итоги за завтраком, обедом и ужином.

main activity

Вот мой Firebase выглядит так: Firebase

Это мой код, который я использовалрассчитать итог. Уверен, было много ошибок:

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


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

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        };
        nameRef.addListenerForSingleValueEvent(eventListener);

Код моей основной активности (Plan Your Meal):


public class PlanMealUser extends AppCompatActivity {

    //BUTTON
    Button backBtn;
    Button addMealBreakBtn;
    Button addMealLunchBtn;
    Button addMealDinnerBtn;

    //DATABASE
    FirebaseAuth mAuth;
    FirebaseUser currentUser;
    DatabaseReference myRef,requiredCalorieRef, mylunchRef, mydinnerRef;

    //TEXT VIEW
    TextView userRequiredCalorie, userTotalCalorie;
    ArrayList<UserRecordsModel> userRecordslist;
    RecyclerView recyclerView, recyclerViewlunch, recyclerViewDinner;

    private RecyclerView.Adapter userRecordHolder;

   //DATE
    String date_record ;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_plan_meal_user);

        date_record = new SimpleDateFormat("yyMMdd", Locale.getDefault()).format(new Date());
        //create a date string.
        String date_n = new SimpleDateFormat("MMM dd, yyyy", Locale.getDefault()).format(new Date());
        //get hold of textview.
        TextView date  = (TextView) findViewById(R.id.datePlanMeal);
        //set it as current date.
        date.setText(date_n);



        //INI VIEWS
        userRequiredCalorie= (TextView) findViewById(R.id.outputPlanMealCalorie);
        userTotalCalorie = (TextView) findViewById(R.id.outputTotalKcal);


        //FIREBASE AUTH
        mAuth = FirebaseAuth.getInstance();
        currentUser=mAuth.getCurrentUser();



        //DATABASE REFERENCE

        myRef = FirebaseDatabase.getInstance().
                getReference("UsersRecords").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child(date_record).child("BreakfastRecord");

        mylunchRef=FirebaseDatabase.getInstance().
                getReference("UsersRecords").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child(date_record).child("LunchRecord");

        mydinnerRef =FirebaseDatabase.getInstance().
                getReference("UsersRecords").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .child(date_record).child("DinnerRecord");



        //RECYCLER VIEW

        //*********BREAKFAST******************************************//
        recyclerView = findViewById(R.id.userRecordRecylerView);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(manager);
        recyclerView.setHasFixedSize(true);

        //ADAPTER
        userRecordslist = new ArrayList<>();
        userRecordHolder = new UserRecordsHolder(userRecordslist);
        recyclerView.setAdapter(userRecordHolder);

        //*********LUNCH******************************************//
        recyclerViewlunch = findViewById(R.id.userRecordRecylerViewLunch);
        LinearLayoutManager manager1 = new LinearLayoutManager(this);
        recyclerViewlunch.setLayoutManager(manager1);
        recyclerViewlunch.setHasFixedSize(true);

        //ADAPTER
        userRecordslist = new ArrayList<>();
        userRecordHolder = new UserRecordsHolder(userRecordslist);
        recyclerViewlunch.setAdapter(userRecordHolder);


        //*********DINNER******************************************//
        recyclerViewDinner = findViewById(R.id.userRecordRecylerViewDinner);
        LinearLayoutManager manager2 = new LinearLayoutManager(this);
        recyclerViewDinner.setLayoutManager(manager2);
        recyclerViewDinner.setHasFixedSize(true);

        //ADAPTER
        userRecordslist = new ArrayList<>();
        userRecordHolder = new UserRecordsHolder(userRecordslist);
        recyclerViewDinner.setAdapter(userRecordHolder);



        //BUTTON
        addMealBreakBtn = (Button) findViewById(R.id.addMealBreakBtn);
        backBtn = (Button)findViewById(R.id.backBtnPlan) ;


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

                /*String userCalorieSuggestion = Double.toString((Double) dataSnapshot.child("daily calorie").getValue());
                showDailyCalorie.setText(("Daily Calorie Suggestion:  " + userCalorieSuggestion  +"kcal"));*/
            }

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

            }

        });


        //*********************************** DATABASE REFERENCE FOR TOTAL KCAL **********************//


        //BACK BUTTON*************************************************
        backBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent signIn = new Intent(PlanMealUser.this,HomepageUser.class);
                startActivity(signIn);
            }
        });


        //ADD MEAL BUTTONS**********************************************
        addMealBreakBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent breakfast = new Intent(PlanMealUser.this,ViewProduct.class);
                startActivity(breakfast);

            }
        });

        addMealLunchBtn = (Button) findViewById(R.id.addMealLunchBtn);
        addMealLunchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent signIn = new Intent(PlanMealUser.this,ViewProduct_Lunch.class);
                startActivity(signIn);

            }
        });

        addMealDinnerBtn = (Button) findViewById(R.id.addMealDinnerBtn);
        addMealDinnerBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent signIn = new Intent(PlanMealUser.this,ViewProduct_Dinner.class);
                startActivity(signIn);


            }
        });

    }

//RECYCLER REVIEW
    @Override
    protected void onStart() {
        super.onStart();
        if (myRef != null) {
            myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {
                        userRecordslist = new ArrayList<>();
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            userRecordslist.add(ds.getValue(UserRecordsModel.class));

                        }
                        UserRecordsHolder userRecordHolder = new UserRecordsHolder(userRecordslist);
                        recyclerView.setAdapter(userRecordHolder);
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(PlanMealUser.this, databaseError.getMessage(),
                            Toast.LENGTH_SHORT).show();
                }
            });

        }

        //LUNCH
        if (mylunchRef != null) {
            mylunchRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {
                        userRecordslist = new ArrayList<>();
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            userRecordslist.add(ds.getValue(UserRecordsModel.class));

                        }
                        UserRecordsHolder userRecordHolder = new UserRecordsHolder(userRecordslist);
                        recyclerViewlunch.setAdapter(userRecordHolder);
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(PlanMealUser.this, databaseError.getMessage(),
                            Toast.LENGTH_SHORT).show();
                }
            });

        }

        //DINNER
        if (mydinnerRef != null) {
            mydinnerRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {
                        userRecordslist = new ArrayList<>();
                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                            userRecordslist.add(ds.getValue(UserRecordsModel.class));

                        }
                        UserRecordsHolder userRecordHolder = new UserRecordsHolder(userRecordslist);
                        recyclerViewDinner.setAdapter(userRecordHolder);
                    }

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    Toast.makeText(PlanMealUser.this, databaseError.getMessage(),
                            Toast.LENGTH_SHORT).show();
                }
            });

        }
    }


}

1 Ответ

2 голосов
/ 12 октября 2019

Да, здесь есть несколько неправильных вещей.

Это, вероятно, ближе:

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"));
            }
        }
        Log.d("TAG", count + "");
    }

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

Изменения, которые я сделал здесь:

  • Добавлены отдельные, вложенные циклы для типов продуктов и записей. Поскольку у вас есть два вложенных динамических уровня, вам понадобятся два вложенных цикла.
  • Вызов getValue(String.class), поскольку вы храните значения в виде строк. На самом деле я бы рекомендовал хранить их как числа, но это в другой части кода.
  • Затем используйте Double.valueOf(...), чтобы преобразовать строку в фактическое двойное значение.
  • Реализация onCanceled, поскольку это может раскрыть важную информацию о проблемах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...