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