Firebase查询检索来自多个孩子的数据并进行数学运算

时间:2016-07-14 21:58:47

标签: android firebase

我正在尝试查询我的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) {

            }
        });

我的数据结构是这样的:

enter image description here

我想要做的是检索"效率"从过去7个日期开始的关键字,并计算它们的平均值。我只是不确定最好的方法。任何人都可以帮助我朝着正确的方向前进吗?

此致 符文

2 个答案:

答案 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");

您还可以使用模型类将所有数据检索到其中。