Firebase – получить данные от startDate до endDate

У меня есть действие, в котором мне нужно выбрать две даты, первую дату и дату окончания. У меня есть две кнопки TextView, при нажатии которых будут отображаться средства выбора даты. После ввода даты мне нужно рассчитать totalCalorie от firstDate до endDate.

Но то, что я получил, - это расчет общего количества калорий по всем датам.

Итак, как я могу это сделать?

Любая помощь будет здорово, спасибо.

Это мои коды:

        //************************* FIRST DAY ***************************//
        firstDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog = new DatePickerDialog(
                        UserHighlights.this,
                        android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener, year, month, day);
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();



            }
        });

        mDateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {

                month = month + 1;
                Log.d(TAG, "onDateSet: dd/mm/yyy: " + day + "/" + month + "/" + year);

                String date1= day + "/" + month + "/" + year;
                fDate.setText(date1);
                dateDisplay_first.setText(date1);

                from_Date = year+""+month+""+day;
                onStart(from_Date);

                updateView();
            }
        };

        //************************* END DATE ***************************//
        endDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Calendar cal = Calendar.getInstance();
                int year = cal.get(Calendar.YEAR);
                int month = cal.get(Calendar.MONTH);
                int day = cal.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog dialog = new DatePickerDialog(
                        UserHighlights.this,
                        android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener_1, year, month, day);
                dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                dialog.show();

            }
        });

        mDateSetListener_1 = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker datePicker, int year, int month, int day) {
                month = month + 1;
                Log.d(TAG, "onDateSet: dd/mm/yyy: " + day + "/" + month + "/" + year);

                String date2= day + "/" + month + "/" + year;
                eDate.setText(date2);
                dateDisplay_end.setText(date2);

                end_Date = year+""+month+""+day;
                onStart_1(end_Date);

                updateView();

            }
        };
    }



    private void updateView() {

       final String newFday = fDate.getText().toString().trim();
       final String newEday = eDate.getText().toString().trim();

        ref.orderByChild("dateRecord").startAt(newFday).endAt(newEday);
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                int count = 0;
                for (DataSnapshot foodTypeSnapshot: dataSnapshot.getChildren()) {

                    String user = String.valueOf((foodTypeSnapshot.child("totalCalorie").getValue()));
                    int totalCount = Integer.parseInt(user);
                    count = count + totalCount;
                    totalCalorie.setText((count  +" kcal"));

                }
                Log.d("TAG", count + "");
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });
    }

Моя база:

моя база данных (пример)


person yunhyeongcharms    schedule 18.11.2019    source источник


Ответы (2)


Ваши даты имеют формат, из-за которого невозможно выбрать диапазон. Чтобы выбрать диапазон, убедитесь, что лексикографический порядок соответствует хронологическому порядку. Другими словами: убедитесь, что это формат, в котором год предшествует месяцу, предшествующему дню.

Итак, любой из них подходит:

"2019-11-17"
"2019/11/17"
"20191117"

Со значениями в этом формате вы можете запрашивать дочерние узлы в диапазоне дат. Например, чтобы получить все узлы в 2019 году, когда значение находится в последнем формате, который вы бы использовали:

Query query = ref.orderByChild("dateRecord").startAt("20190101").endAt("20191231");
query.addListenerForSingleValueEvent(new ValueEventListener() {
  ...

Также см:

person Frank van Puffelen    schedule 18.11.2019
comment
отметил, я попытаюсь решить проблему, следуя вашему совету - person yunhyeongcharms; 19.11.2019

Вы пытаетесь выбрать данные диапазона, используя сравнение строк, что не дает вам правильных данных. Невозможно определить, что 18/11/2019 больше, чем 19/11/2018, путем сравнения строк. Попробуйте сохранить dateRecord в формате TimeInMilis или yyyyMMdd. Спасибо

person Md. Asaduzzaman    schedule 18.11.2019
comment
@yunhyeongcharms, ты проверял это? - person Md. Asaduzzaman; 19.11.2019
comment
отметил, я попытаюсь решить проблему, следуя вашему совету - person yunhyeongcharms; 19.11.2019