Android Firebase查询从几个子级检索数据并进行数学运算
我正在尝试对我的firebase进行查询,以计算一些条目的平均值 我觉得我没有完全理解这一点,我觉得我在黑暗中摸索 我尝试检索数据的代码如下所示:Android Firebase查询从几个子级检索数据并进行数学运算,android,firebase,Android,Firebase,我正在尝试对我的firebase进行查询,以计算一些条目的平均值 我觉得我没有完全理解这一点,我觉得我在黑暗中摸索 我尝试检索数据的代码如下所示: Calendar mcurrentTime = Calendar.getInstance(); int day = mcurrentTime.get(Calendar.DAY_OF_MONTH); int month = mcurrentTime.get(Calendar.MONTH)+1; int y
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) {
}
});
我的数据结构如下:
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个日期中检索“效率”键,并计算它们的平均值。我只是不确定最好的方法。有人能帮我找到正确的方向吗
问候
符文首先,你不应该像这样在它里面有一个
日期
节点,这不是对节点进行排序的正确方法
第二个endAt()
如果你正在搜索日期,你应该使用datasnapshot.getKey()
而不是datasnapshot.getValue().toString()
,并且会一个接一个地启动键
对于effeciency
您可以使用hashMap
Map<String, String> data = (HashMap<String, String>) dataSnapshot.getValue();
String Efficency=data.get("efficency");
Map data=(HashMap)dataSnapshot.getValue();
字符串效率=data.get(“效率”);
您还可以使用模型类将所有数据检索到数据库中。在构建数据库时,您必须尝试将其设置为一个查询提供您希望在屏幕上显示的所有数据。例如,如果要显示过去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) {
}
});
如果计算平均值是处理数据的唯一方法,那么不需要存储单独的日期节点。但是,如果您只想处理日期,然后显示某个确切日期发生的情况(例如,单击列表中的某个项目),则“额外日期”节点将非常有用。我完全按照您在此处所说的做,因此我有日期列表。:)他不是在找约会对象。他正在检查7天的数据是否完整。另外,为什么存储一个单独的日期节点不是一个好主意?因为如果您在特定的项目列表中放置不同的内容,这不是一个好的做法,可能会在以后的事情中产生问题。问题是什么?如果您知道有一个日期节点,并且如果您正确设置了安全规则,我不认为这是一个问题,因为可以使用startAt()和endAt()。但是我想创建一个带有“datesWithDetails”的单独节点或者其他更好的东西我现在已经将dates节点移动到了一个单独的位置。今天早些时候,我遇到了查询问题。我刚刚意识到这对你来说可能完全没有用。这一点都没有用,我想这正是我所需要的。我试试看我在想。。如果你实现了这一点,那么在最初的7天里你是如何做到的呢?我会在我们谈话时弄清楚这一点。考虑检查节点上是否存在数据,如果不存在,我将启动效率设置为50。我能想到的唯一解决办法。好吧,我几乎做到了我说的。我检查数据是否存在,如果不存在,我将今天的效率设置为前一天的效率。