我正在尝试查询我的firebase以计算某些条目的平均值。
我觉得我完全理解这一点,觉得我在黑暗中摸索。
我尝试检索数据的代码如下:
Calendar mcurrentTime = Calendar.getInstance();
int day = mcurrentTime.get(Calendar.DAY_OF_MONTH);
int month = mcurrentTime.get(Calendar.MONTH)+1;
int year = mcurrentTime.get(Calendar.YEAR);
String dateString = year + checkDigit(month) + checkDigit(day);
Long date = Long.valueOf(dateString);
Long alongweekago = date - 6;
String aweekago = alongweekago.toString();
String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
mDatabase = FirebaseDatabase.getInstance().getReference().child(userId);
Query lastSevenDays = mDatabase.orderByKey().endAt(aweekago).limitToLast(7);
lastSevenDays.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
final String lastsevendates = dataSnapshot.getValue().toString();
Log.w(TAG, lastsevendates);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我的数据结构是这样的:
我想要做的是检索"效率"从过去7个日期开始的关键字,并计算它们的平均值。我只是不确定最好的方法。任何人都可以帮助我朝着正确的方向前进吗?
此致 符文
答案 0 :(得分:2)
在构建数据库时,必须尝试使查询为您提供要在屏幕上显示的所有数据。例如,如果要显示过去7天的效率,可以在每天添加时执行此操作,而不是稍后计算,然后只查询它。
"userId":{
"weekEfficiency":{
"average": 50
"prevEfficiency":20
}
"20160710":{...}
"20160711":{...}
}
在这种结构中,无论何时添加新的一天,都要做这样的事情
mDatabase = FirebaseDatabase.getInstance().getReference(userId);
mDatabase.child(dateString).setValue(whateverYouSetRightNow);
Double average = null;
mDatabase.child("weekEfficiency").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
Map<String, String> data = (HashMap<String, String>) dataSnapshot.getValue;
double efficiency = Double.parseDouble(data.get("average"));
double prevEfficiency = Double.parseDouble(data.get("prevEfficiency"));
average = (efficiency*7-prevEfficiency+efficiencyToday)/7;
setAverage(average)
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
以下是方法setAverage:
private void setAverage(double average) {
mDatabase.child("weekEfficiency").child("prevEfficiency").setValue(efficiencyToday);
mDatabase.child("weekEfficiency").child("average").setValue(average);
}
答案 1 :(得分:1)
首先,您不应该在其中包含dates
节点,这不是订购节点的正确方法。
如果您确定该节点实际存在,则应使用第二个endAt()
如果你正在搜索日期,你应该使用datasnapshot.getKey()
而不是dataSnapshot.getValue().toString()
,然后一个接一个地发射密钥。
对于efficeincy
,您可以使用hashMap
Map<String, String> data = (HashMap<String, String>) dataSnapshot.getValue();
String Efficency=data.get("efficency");
您还可以使用模型类将所有数据检索到其中。