# #java #android #arrays #sorting #firebase-realtime-database
#Ява #Android #массивы #сортировка #firebase-база данных в реальном времени
Вопрос:
Мне нужно получить количество записей за текущий день из базы данных. Записи в реальном времени Firebase находятся в метке времени, я анализирую их с помощью SimpleDateFormat.
Но я не смог получить количество записей, например, на сегодняшнюю дату. Скажи мне, что делать? Спасибо
ЗАПИСИ ИЗОБРАЖЕНИЙ В FIREBASE В РЕАЛЬНОМ ВРЕМЕНИ
private void fetchDataWaterCount() { currDate = null; String uid = firebaseAuth.getUid(); if (android.os.Build.VERSION.SDK_INT gt;= android.os.Build.VERSION_CODES.O) { currDate = LocalDate.now().toString(); } waterRef = FirebaseDatabase.getInstance().getReference("Users").child(uid).child("body").child("water"); waterRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { for (DataSnapshot ds : snapshot.getChildren()) { waterModel = ds.getValue(WaterModel.class); waterArray.add(waterModel); waterModel.setWaterModelList(waterArray); ArrayList listDate = new ArrayList(); for (int i = 0; i lt; waterModel.getWaterModelList().size(); i ) { long dateList = waterModel.getWaterModelList().get(i).getDate(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US); String dateFormat = formatter.format(new Date(dateList)); listDate.add(dateFormat); if(listDate.contains(currDate)){ int water_count = (int) listDate.size(); drawable = getActivity().getDrawable(R.drawable.circut_progress_bar); progressBar.setProgress(water_count); progressBar.setMax(12); progressBar.setSecondaryProgress(water_count); progressBar.setProgressDrawable(drawable); textViewWaterCount.setText(String.valueOf(water_count)); if (water_count gt;= 12) { textViewWaterCount.setText("Done"); textViewWaterCount.setTextColor(getResources().getColor(R.color.colorGreen_900)); drawable = getActivity().getDrawable(R.drawable.circut_progressbar_green); progressBar.setProgressDrawable(drawable); } } } } } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
Комментарии:
1. Можете ли вы проверить, что 2 строки датируются
currDate
иdateFormat
совпадают в любой момент времени? Есть 2 причиныlistDate.contains(currDate)
return false
для этого . Просто нет совпадающей даты ИЛИ есть совпадающая дата, но она неправильно отформатирована, потомуString
что на данный момент вы просто сравниваете s.2. Почему бы не использовать запрос с
startAt(startOfTheDay)
иendAt(endOfTheDay)
?3. @avalerio Спасибо за ваш ответ. Я вижу в журналах
listDate.contains(currDate)
, чтоreturn true
… Я проверил дату форматирования в массиве и вcurrDate
. Это то же самое.4. @AlexMamo Это хорошая идея! Я постараюсь. Спасибо
Ответ №1:
Если вы хотите знать количество WaterModels
совпадений с определенной датой, вам нужно посчитать их по мере их появления.
В настоящее время вы добавляете каждую дату в список , независимо от того, соответствует ли она currDate
, поэтому ваше количество-это общее количество дат, а не конкретное количество конкретных дат.
//Add this int dateCount = 0; for (int i = 0; i lt; waterModel.getWaterModelList().size(); i ) { long dateList = waterModel.getWaterModelList().get(i).getDate(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.US); String dateFormat = formatter.format(new Date(dateList)); listDate.add(dateFormat); //Add this if(dateFormat == currDate){ dateCount ; } //I don't know what your doing here but this will return true //if there is at least 1 match. You can't use this to track how many dates //match if (listDate.contains(currDate)) { int water_count = (int) listDate.size(); drawable = getActivity().getDrawable(R.drawable.circut_progress_bar); progressBar.setProgress(water_count); progressBar.setMax(12); progressBar.setSecondaryProgress(water_count); progressBar.setProgressDrawable(drawable); textViewWaterCount.setText(String.valueOf(water_count)); if (water_count gt;= 12) { textViewWaterCount.setText("Done"); textViewWaterCount.setTextColor(getResources().getColor(R.color.colorGreen_900)); drawable = getActivity().getDrawable(R.drawable.circut_progressbar_green); progressBar.setProgressDrawable(drawable); } } }
dateCount
будет содержать общее количество дат, которые соответствуют currDate
.
Комментарии:
1. очень услужливо. Большое спасибо