Firebase - 获取从开始日期到结束日期的数据
Firebase - Get Data from startDate to endDate
我有一个 activity 需要 select 两个日期,第一个日期和一个结束日期。我有两个 TextView 按钮,单击它们会显示日期选择器。输入日期后,我需要计算从 firstDate 到 endDate 的 totalCalorie。
但我得到的数据是根据所有日期计算的总卡路里。
那我该怎么做呢?
如有帮助将非常感谢。
这是我的代码:
//************************* FIRST DAY ***************************//
firstDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(
UserHighlights.this,
android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
Log.d(TAG, "onDateSet: dd/mm/yyy: " + day + "/" + month + "/" + year);
String date1= day + "/" + month + "/" + year;
fDate.setText(date1);
dateDisplay_first.setText(date1);
from_Date = year+""+month+""+day;
onStart(from_Date);
updateView();
}
};
//************************* END DATE ***************************//
endDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(
UserHighlights.this,
android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener_1, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
mDateSetListener_1 = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
Log.d(TAG, "onDateSet: dd/mm/yyy: " + day + "/" + month + "/" + year);
String date2= day + "/" + month + "/" + year;
eDate.setText(date2);
dateDisplay_end.setText(date2);
end_Date = year+""+month+""+day;
onStart_1(end_Date);
updateView();
}
};
}
private void updateView() {
final String newFday = fDate.getText().toString().trim();
final String newEday = eDate.getText().toString().trim();
ref.orderByChild("dateRecord").startAt(newFday).endAt(newEday);
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int count = 0;
for (DataSnapshot foodTypeSnapshot: dataSnapshot.getChildren()) {
String user = String.valueOf((foodTypeSnapshot.child("totalCalorie").getValue()));
int totalCount = Integer.parseInt(user);
count = count + totalCount;
totalCalorie.setText((count +" kcal"));
}
Log.d("TAG", count + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
我的 Firebase:
您的日期格式无法 select 范围。为了 select 一个范围,确保字典顺序与时间顺序相匹配。换句话说:确保它的格式是年在月之前在日之前。
所以这些都可以:
"2019-11-17"
"2019/11/17"
"20191117"
使用这种格式的值,您可以查询日期范围内的子节点。例如,要获取 2019 年的所有节点,当值是您使用的最后一种格式时:
Query query = ref.orderByChild("dateRecord").startAt("20190101").endAt("20191231");
query.addListenerForSingleValueEvent(new ValueEventListener() {
...
另见:
您正在尝试使用字符串比较来 select 范围数据,但它不会为您提供正确的数据。通过字符串比较无法确定 18/11/2019
是否大于 19/11/2018
。尝试以 TimeInMilis
或 yyyyMMdd
格式存储 dateRecord
。谢谢
我有一个 activity 需要 select 两个日期,第一个日期和一个结束日期。我有两个 TextView 按钮,单击它们会显示日期选择器。输入日期后,我需要计算从 firstDate 到 endDate 的 totalCalorie。
但我得到的数据是根据所有日期计算的总卡路里。
那我该怎么做呢?
如有帮助将非常感谢。
这是我的代码:
//************************* FIRST DAY ***************************//
firstDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(
UserHighlights.this,
android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
Log.d(TAG, "onDateSet: dd/mm/yyy: " + day + "/" + month + "/" + year);
String date1= day + "/" + month + "/" + year;
fDate.setText(date1);
dateDisplay_first.setText(date1);
from_Date = year+""+month+""+day;
onStart(from_Date);
updateView();
}
};
//************************* END DATE ***************************//
endDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(
UserHighlights.this,
android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener_1, year, month, day);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.show();
}
});
mDateSetListener_1 = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
month = month + 1;
Log.d(TAG, "onDateSet: dd/mm/yyy: " + day + "/" + month + "/" + year);
String date2= day + "/" + month + "/" + year;
eDate.setText(date2);
dateDisplay_end.setText(date2);
end_Date = year+""+month+""+day;
onStart_1(end_Date);
updateView();
}
};
}
private void updateView() {
final String newFday = fDate.getText().toString().trim();
final String newEday = eDate.getText().toString().trim();
ref.orderByChild("dateRecord").startAt(newFday).endAt(newEday);
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int count = 0;
for (DataSnapshot foodTypeSnapshot: dataSnapshot.getChildren()) {
String user = String.valueOf((foodTypeSnapshot.child("totalCalorie").getValue()));
int totalCount = Integer.parseInt(user);
count = count + totalCount;
totalCalorie.setText((count +" kcal"));
}
Log.d("TAG", count + "");
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
我的 Firebase:
您的日期格式无法 select 范围。为了 select 一个范围,确保字典顺序与时间顺序相匹配。换句话说:确保它的格式是年在月之前在日之前。
所以这些都可以:
"2019-11-17"
"2019/11/17"
"20191117"
使用这种格式的值,您可以查询日期范围内的子节点。例如,要获取 2019 年的所有节点,当值是您使用的最后一种格式时:
Query query = ref.orderByChild("dateRecord").startAt("20190101").endAt("20191231");
query.addListenerForSingleValueEvent(new ValueEventListener() {
...
另见:
您正在尝试使用字符串比较来 select 范围数据,但它不会为您提供正确的数据。通过字符串比较无法确定 18/11/2019
是否大于 19/11/2018
。尝试以 TimeInMilis
或 yyyyMMdd
格式存储 dateRecord
。谢谢