Как сортировать данные в базе данных Firebase RealTime на основе будущей даты / времени - PullRequest
1 голос
/ 21 апреля 2020

Я создаю приложение, и главная особенность приложения заключается в том, что пользователь сможет планировать поездки в будущем, и приложение будет уведомлять его, когда начинать навигацию там. Я хочу хранить и сортировать предстоящие поездки на основе даты и времени (ближайшая на текущую дату - первая).

Я нашел несколько ответов в StackOverflow о проблеме с датой, но все ответы касались получения текущего времени из системы с использованием ServerValue.TIMESTAMP (и сохранения его с использованием метки времени в базе данных реального времени Firebase).

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

В настоящее время поездки хранятся в порядке их добавления в мою базу данных, как показано на изображении ниже: enter image description here

В настоящее время я записываю данные для поездки в базу данных как объект Trip, например:

    //Store date,time and destination on a new Trip.
    datePassed = dateText.getText().toString();
    timePassed = timeText.getText().toString();

    trip = new Trip(destinationPassed, datePassed, timePassed);

    //Get uId of the Firebase User.
    String uId = currentFirebaseUser.getUid();

    //Create a unique Hash Key for the Trip. (Used to Distinguish trips)
    String tripId = Integer.toString(trip.getTripId(destinationPassed, datePassed, timePassed));

    //Store the trip on Firebase RealTime Database.
    DatabaseReference childReff = dbRef.child(uId).child("trips").child(tripId);
    childReff.setValue(trip);

, и я получаю данные следующим образом:

    //Get uId of the user
    final String uId = currentFirebaseUser.getUid();


    dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot child : dataSnapshot.child(uId).child("trips").getChildren()) {

                //Here I access each child separately (destination, date, time)
                date = child.child("date").getValue().toString();
                destination = child.child("destination").getValue().toString();
                time = child.child("time").getValue().toString();

My Вопрос в том, как мне добиться сохранения и отключений в порядке возрастания (ближайший на текущую дату является первым) для отключений, которые установлены в будущем?

1 Ответ

1 голос
/ 22 апреля 2020

Хорошо, так что я разобрался с ответом. В будущем я опубликую то, что сделал, если у кого-то возникнет тот же вопрос.

Я создал метод, который преобразует строковые даты в длинные (миллисекунды). (Это то, что база данных firebase использует для времени и даты.)

   public Long toMilli(String dateIn) throws ParseException {
    DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm");
    Date date = (Date) formatter.parse(dateIn);
    long output = date.getTime() / 1000L;
    String str = Long.toString(output);
    long timestamp = Long.parseLong(str) * 1000;
    return timestamp;
    }

Я преобразую дату, вызвав метод:

//Store date,time and destination on a new Trip.
    datePassed = dateText.getText().toString();
    timePassed = timeText.getText().toString();

    String dateSelected = dateText.getText().toString() + " " + timeText.getText().toString();
    Long timestamp = toMilli(dateSelected);

Я создал новую конструкцию для Trip и store новая временная метка (Long) там и сохранила Trip в базе данных.

    public Trip(String destination, Long timestamp) {
    this.destination = destination;
    this.timestamp = timestamp;
}

Чтобы прочитать данные из базы данных:

    //Get uId of the user
    final String uId = currentFirebaseUser.getUid();


    dbRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot child : dataSnapshot.child(uId).child("trips").getChildren()) {
                String destination = child.child("destination").getValue().toString();
                Long timestamp = child.child("timestamp").getValue(Long.class);

Следующий шаг - преобразование Long в String. Для этого я создал новый метод.

    public String convertTime(long time){
    Date date = new Date(time);
    Format format = new SimpleDateFormat("dd/MM/yyyy HH:mm");
    return format.format(date);
}

И, наконец, вызовите метод:

String time=convertTime(timeLong);

Перед чтением данных я создал новый ArrayList, затем я создаю новый объект - Trip в моем случае и передаются в значениях. Каждый раз, когда я читал детскую поездку - с помощью команды l oop я добавлял ее в список.

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

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