Сортировка по дате и вывод данных из FirebaseDatabase RealTime
UPD!
Всем привет, я начинающий.
Для работы мне понадобилась программа для сбора статистики и последующего вывода ее с разными математическими действиями.
Вся математика происходит у пользователя, все данные грузятся в RealTime Database(опустим вопрос почему). Работа посменная и при этом отчетный месяц сдвинут и расчитывается с 26 по 25 число каждого месяца. На данный момент я не разобрался полностью и многое делаю методом нучного тыка:) Для того чтобы понимать какая была смена у меня в коде есть вот это :
Calendar calendarDate = Calendar.getInstance();
@SuppressLint("SimpleDateFormat") final SimpleDateFormat currentDate = new SimpleDateFormat("dd-MM-yyyy");
currentDateOrderList = currentDate.format(calendarDate.getTime());
В последствии currentDateOrderList становится узлом в дереве и детем. Такого плана дерево в БД :
"Pointers List" : {
"BqtVqy2jsQc2mkL3iGEgOxFd3122" : {
"24-04-2020" : {
"date" : "24-04-2020",
"resultPoint" : 352.5
},
"14-05-2020" : {
"date" : "14-05-2020",
"resultPoint" : 385.5
},
"15-05-2020" : {
"date" : "15-05-2020",
"resultPoint" : 383.5
}
}
Для того чтобы выводить только необходимые смены в интервале 26-25 числа месяца я думал что будет просто, но вскоре понял что ошибался. Начал с попыток просто хардкорно использовать FirebaseAdapter c query:
workshiftRef = FirebaseDatabase.getInstance().getReference().child("Pointers List").child(currentUserId);
Query query = workshiftRef.orderByChild("date").startAt("26-04-2020").endAt("25-05-2020");
Естественно попытка провалилась. И теперь я не знаю как быть. Нашел верный способ сохранения даты в строковом формате для сортировки. Переделал формт в "yyy-MM-dd" и строка заработала!
Query query = workshiftRef.orderByChild("date").startAt("2020-04-26").endAt("2020-05-25");
Мое видение решения: У меня есть только фиксированные расчетные дни начало 26 дня и конец 25 дня любого месяца. То есть при запуске приложения должна пройти проверка текущей даты. К примеру сегодня 17.05.2020, из этой даты нужно получить месяц и день. Получаю месяц май. Получив месяц я должен составить границы: это может быть либо 26.апреля - 25.мая, либо 26 мая- 25.июня. Проверка вхождения текущей даты в интервал. Но как это связать с БД я не понимаю.
Как можно получать только те данные которые необходимы в интервале дат? Может быть я должен как-то сохранять в другом формате дату в firebase? Дублировать где-то ее. Сейчас я просто по истечении периода удаляю старые данные..
Ответы (1 шт):
Придумал вот такой метод в onCreate()
private void CreateDateRange() throws ParseException {
SimpleDateFormat currentDate = new SimpleDateFormat("yyyy-MM-dd");
if (0 < currentMonth && currentMonth < 10) { //1
firstMonthStart = "0" + currentMonth; //02
firstMonthEnd = "0" + (currentMonth + 1);//03
secondMonthEnd = "0" + (currentMonth + 2); //04
} else if (currentMonth == 0) { //0
firstMonthStart = "12"; //12
firstMonthEnd = "0" + (currentMonth + 1);//01
secondMonthEnd = "0" + (currentMonth + 2); //02
} else if (currentMonth == 11) {//11
firstMonthStart = currentMonth + ""; //11
firstMonthEnd = "" + (currentMonth + 1);//12
secondMonthEnd = "01"; //01
} else { //10
firstMonthStart = "" + currentMonth; //10
firstMonthEnd = "" + (currentMonth + 1);//11
secondMonthEnd = "" + (currentMonth + 2); //12
}
firstDateStart = currentYear + "-" + firstMonthStart + "-" + 26; //2020-4-26
firstDateEnd = currentYear + "-" + firstMonthEnd + "-" + 25; //2020-5-25
secondDateStart = currentYear + "-" + firstMonthEnd + "-" + 26; //2020-5-26
secondDateEnd = currentYear + "-" + secondMonthEnd + "-" + 25; //2020-6-25
Date firstDateEndRange = currentDate.parse(firstDateEnd);
Date currentDateWorkShift = currentDate.parse(dateWorkshift); //2020-05-24
if (Objects.requireNonNull(firstDateEndRange).before(currentDateWorkShift)
|| firstDateEndRange.equals(currentDateWorkShift)) {
date1 = secondDateStart;
date2 = secondDateEnd;
} else {
date1 = firstDateStart;
date2 = firstDateEnd;
}
Вроде заработало. Пойдет или премудрил?