【问题标题】:How to Sort Data in Firebase RealTime Database based on Future Date/Time如何根据未来日期/时间对 Firebase 实时数据库中的数据进行排序
【发布时间】:2020-08-04 15:22:24
【问题描述】:

我正在创建一个应用程序,该应用程序的主要功能是用户将能够计划未来的旅行,并且该应用程序会通知他何时开始在那里导航。我想根据日期和时间(当前日期最接近的行程排在第一位)存储和排序即将到来的行程。

我在 StackOverflow 中找到了一些关于日期问题的答案,但所有答案都是关于使用 ServerValue.TIMESTAMP 从系统获取当前时间(并使用时间戳将其存储在 Firebase 实时数据库中)。

这仅适用于存储当前日期和时间。我有兴趣获取未来日期的时间戳。

行程目前按添加到我的数据库中的顺序存储,如下图所示:

我目前将行程的数据作为行程对象写入数据库中,如下所示:

    //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();

我的问题是,对于未来设置的行程,我如何才能实现按升序存储和行程(当前日期最接近的行程是第一个)?

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    好的,所以我想出了答案。我会发布我所做的,以防将来有人有同样的问题。

    我创建了一个将字符串日期转换为长(毫秒)的方法。 (这是 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 创建了一个新结构,并将新的时间戳(Long)存储在那里,并将 Trip 存储在数据库中。

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

    从 firebase 读取数据:

        //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 并传入值。 每次我阅读儿童旅行时,我都会使用 for 循环将其添加到列表中。

    最后,我在将列表显示给用户之前对其进行了排序。您必须重写 CompareTo 才能使其正常工作。

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 2019-05-04
      • 2017-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多