Как отсортировать значения, используя даты в качестве ключей в Firebase - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь составить список дел, и каждый раз, когда пользователь устанавливает флажок, он добавляет истину / ложь к соответствующей дате. Проблема заключается в том, что firebase не сортирует строки даты, поэтому после некоторых исследований я обнаружил, что мне нужно использовать timeInMillis, но Firebase не позволяет использовать ключи, кроме строк ... Database snapshot

Вот так я получаю даты ..

habitosQuery.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            mHabitosList.clear();
            for (DataSnapshot habitosSnapshot : dataSnapshot.getChildren()) {
                Habitos habitos = habitosSnapshot.getValue(Habitos.class);

                Checks = habitos.getChecks();
                Map<String, Boolean> sortedChecks = new TreeMap<>(Checks);
                List<Map.Entry<String, Boolean>> entryList =
                        new ArrayList<>(sortedChecks.entrySet());
                Map.Entry<String, Boolean> lastEntry =
                        entryList.get(entryList.size() - 1);

                try {
                    lastDateEntry = sdf.parse(lastEntry.getKey());

                } catch (ParseException e) {
                    e.printStackTrace();
                }
                Date today = focus.getToday();
                int diffLastToday = focus.daysBetween(lastDateEntry, today);

                for (int x = 0; x < diffLastToday; x++) {
                    Calendar calendar = Calendar.getInstance();
                    calendar.setTime(lastDateEntry);
                    calendar.add(Calendar.DAY_OF_MONTH, +1);
                    Checks.put(sdf.format(calendar.getTimeInMillis()), false);
                }

                habitos.setChecks(Checks);
                mHabitosList.add(habitos);
                mHabitosAdapter.notifyDataSetChanged();
                habitosQuery.child(habitos.getHabitosId()).child("checks").setValue(Checks);

            }

1 Ответ

0 голосов
/ 27 августа 2018

Так что мне удалось это сделать, вот как я это сделал ... Сначала вы должны получить ваши дни в миллисекундах String, я создал этот метод для этого:

public String[] getPreviousFiveDays()  {    
Calendar cal = Calendar.getInstance();
        String dates[] = new String[5];
        cal.add(Calendar.DAY_OF_MONTH, 0 );
        dates[0] = cal.getTimeInMillis()+"";
        for (int i = 1; i < 5; i++){
            cal.add(Calendar.DAY_OF_MONTH,-1);
            dates[i] = cal.getTimeInMillis()+"";
        }
        return dates;
    }

Затем, так как я хотел сохранить и изменить даты, я создал HashMap для объекта ..

   private Map<String, Boolean> mChecks;
public Map<String, Boolean> getChecks() {
    return mChecks;
}

public void setChecks(Map<String, Boolean> checks) {
    mChecks = checks;
}

Затем, чтобы изменить даты, когда CheckBox был отмечен, я получил ключи следующим образом (поскольку я только что использовал последние пять ключей, я получил только те):

 mChecks = new TreeMap<>(habitos.getChecks());

        List<Map.Entry<String, Boolean>> entryList =
                new ArrayList<>(mChecks.entrySet());
        for (int x=0; x<5; x++) {
            int y = 1 + x;
            Map.Entry<String, Boolean> entry =
                    entryList.get(entryList.size() - y);
            mDays[x] = entry.getKey();

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...