首页 > 解决方案 > 从父节点获取 Firebase 中的第一个和最后一个子键

问题描述

我正在构建一个在 Android Studio 中管理日期的小应用程序。为此,我在 Firebase 中创建了以下数据库:

在此处输入图像描述

所有日期均采用格式YYYYMMDD。我希望检索config节点的第一个和最后一个孩子的键(即 20190101,让我们说20211231)。

Callback我为每个日期使用了来自抽象类的两个回调函数。

我的代码:

public class Validator{
     public static void getMinMaxDatesFromDB(final Callback callback)
        {
            FirebaseDatabase db = FirebaseDatabase.getInstance();
            DatabaseReference ref = db.getReference("config");
            // Get First Date from Firebase
            ref.limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener()
            {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    for(DataSnapshot snapshot : dataSnapshot.getChildren())
                    {
                        callback.minDate(snapshot.getKey());
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError)
                {
                    throw databaseError.toException();
                }
            });
            // Get Last Date from Firebase
            ref.limitToLast(1).addListenerForSingleValueEvent(new ValueEventListener()
            {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    for(DataSnapshot snapshot : dataSnapshot.getChildren())
                    {
                        callback.maxDate(snapshot.getKey());
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError)
                {
                    throw databaseError.toException();
                }
            });
        }
}

和来电者:

// Date format - YYYYMMDD (String)
Validator.getMinMaxDatesFromDB(new Callback() {
    @Override
    void minDate(String minDate) {
        super.minDate(minDate);
        int year = Integer.parseInt(minDate.substring(0,3));
        int month = Integer.parseInt(minDate.substring(4,5));
        int day = Integer.parseInt(minDate.substring(6,7));
        //some more logic
    }

    @Override
    void maxDate(String maxDate) {
        super.maxDate(maxDate);
        int year = Integer.parseInt(maxDate.substring(0,3));
        int month = Integer.parseInt(maxDate.substring(4,5));
        int day = Integer.parseInt(maxDate.substring(6,7));
        // some more logic 
    }
});

但我正在进入"config"minDate不是"20190101"

我会很感激帮助。

PS 此外,我还想知道是否有更好的方法来检索特定节点的第一个和最后一个子节点而不使用循环,或者回调是我唯一的选择?

标签: javaandroidfirebasefirebase-realtime-database

解决方案


推荐阅读