Java 如何在Firebase上使用日期作为键对值进行排序

Java 如何在Firebase上使用日期作为键对值进行排序,java,android,firebase,Java,Android,Firebase,我正在尝试创建一个待办事项列表,每次用户选中一个复选框时,它都会在相应的日期中添加一个true/false。问题是firebase不对日期字符串进行排序,所以经过一些研究,我发现我必须使用timeInMillis,但firebase不允许使用字符串以外的键。。。 这就是我检索日期的方式 habitosQuery.addValueEventListener(new ValueEventListener() { @Override public void onDat

我正在尝试创建一个待办事项列表,每次用户选中一个复选框时,它都会在相应的日期中添加一个true/false。问题是firebase不对日期字符串进行排序,所以经过一些研究,我发现我必须使用timeInMillis,但firebase不允许使用字符串以外的键。。。

这就是我检索日期的方式

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

            }
HabitoQuery.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
mHabitosList.clear();
对于(DataSnapshot HabitoSnapshot:DataSnapshot.getChildren()){
Habitos Habitos=habitosSnapshot.getValue(Habitos.class);
Checks=habitos.getChecks();
地图分类检查=新树形图(检查);
列表条目列表=
新的ArrayList(sortedChecks.entrySet());
Map.Entry最后一个条目=
get(entryList.size()-1);
试一试{
lastDateEntry=sdf.parse(lastEntry.getKey());
}捕获(解析异常){
e、 printStackTrace();
}
Date today=focus.getToday();
int diffLastToday=focus.daysBetween(lastDateEntry,今天);
对于(int x=0;x
所以我设法做到了,下面是我是如何做到的。。。 首先,你必须以毫秒为单位计算你的天数,我为此创建了这个方法:

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;
    }
public字符串[]getPreviousFiveDays(){
Calendar cal=Calendar.getInstance();
字符串日期[]=新字符串[5];
cal.add(日历日/月,0);
日期[0]=cal.getTimeInMillis()+“”;
对于(int i=1;i<5;i++){
cal.add(日历日,月日,-1);
日期[i]=cal.getTimeInMillis()+“”;
}
返回日期;
}
然后,因为我想保存和修改日期,我在对象上创建了一个HashMap

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

public void setChecks(Map<String, Boolean> checks) {
    mChecks = checks;
}
private-Map-mChecks;
公共地图getChecks(){
返回mChecks;
}
公共无效设置检查(映射检查){
mChecks=支票;
}
然后,为了修改选中复选框的日期,我检索了如下键(因为我只使用了最后五个键,所以只检索了这些键):

mChecks=newtreemap(habitos.getChecks());
列表条目列表=
新的ArrayList(mChecks.entrySet());

对于(int x=0),席不实际理解以毫秒为单位使用键的问题。不能用字符串表示吗?你是正确的,你只要在长值的末尾加上“+”,现在又有一个问题激增了,你如何得到特定的键来更新这个值?因为时间戳在不断地变化。
 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();

        }