Android Firebase - 计算列表中值的总出现次数

时间:2016-09-23 04:48:31

标签: android firebase firebase-realtime-database

在我的项目中,用户可以创建列表并使用项目填充列表。然后,他们可以为每个列表项设置单个类别。有三个类别(是,否和未知)。

我试图获得每个类别的计数总数。例如,用户的列表包含20个项目 - > 20个中的10个被分类为"是",5是"否",最后5个是"未知。"

我在这里:

ListDetailsActivity

listItemsReference = FirebaseDatabase.getInstance().getReference()
        .child("list-items")
        .child(listId);

    ...

listItemsReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child : dataSnapshot.getChildren()){
            Legislator legislator = child.getValue(Legislator.class);
            if (legislator.getCategory() != null){
                Log.d("category", legislator.getCategory());
            }

        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "onCancelled", databaseError.toException());
    }
});

日志返回以下内容:

09-23 00:23:36.995 7359-7359/com.example.me.firebasesimplelist2 D/category: Yes
09-23 00:23:36.995 7359-7359/com.example.me.firebasesimplelist2 D/category: Yes
09-23 00:23:36.995 7359-7359/com.example.me.firebasesimplelist2 D/category: No

我如何获得每个类别的总数?在哪里,"是"将返回2,"否"会返回1?

如果它有帮助,这里是JSON的一部分:

{
  "-KSKFE4MIqJOVwHI7EXW" : {
    "smithJ" : {
      "category" : "Yes",
      "categorySet" : true,
      "name" : "John Smith",
    },
    "bobB" : {
      "category" : "Yes",
      "categorySet" : true,
      "name" : "Billy Bob",
    },
    "jonesS" : {
      "category" : "No",
      "categorySet" : true,
      "name" : "Susy Jones",
    }
  }
}

我是否比这更复杂?我感觉我已经过度思考了......

1 个答案:

答案 0 :(得分:2)

首先关闭对象列表的父级(在您的情况下为“-KSKFE4MIqJOVwHI7EXW”),方法是转到onCreate方法或onCreateView(如果您正在使用片段)并添加:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child(yourParent);

并为每个类别添加int

int yes;
int no;
int unknown;

现在,添加ValueEventListener

ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

onDataChange内,您需要在每个foreach的孩子身上设置一个dataSnapshot循环:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
   for(DataSnapshot snapShot:dataSnapshot.getChildren(){
       // Go to the next step
     }
}

现在,通过将其添加到我们制作的foreach循环中,查看它是“是”,“否”还是“未知”:

switch(snapShot.child("category").getValue(String.class)){ //This statement is seeing what "category" is.
  case "Yes":
    ++yes; //This is the "yes" int we made earlier; ++ increments 1.
    break;
  case "No":
    ++no; //This is the "no" int we made earlier; ++ increments 1.
    break;
  case "Unknown":
    ++unknown; //This is the "no" int we made earlier; ++ increments 1.
    break;
}

最后,所有int的数字都是未知,是和否。