繁体   English   中英

从 Firebase Java 检索计数数据

[英]Retrieve count data from Firebase Java

我正在尝试计算我的数据库表中满足特定条件的孩子的数量。 如果isSeen列等于false那么我想计算它,如果它等于true我不想计算它。

目前,它不起作用,但如果我将查询从Query query = usersRef.orderByChild("isSeen").equalTo(true); to Query query = usersRef.orderByChild("isSeen"); 我得到一个数字,但这不是正确的方法。 有人可以帮帮我吗?

 {
  "DIt5bGqw2WS4eGHNqQJKxZSn3B72": {
    "b3vYlKZFrje0e3wHyBlWIK4ooK93": {
      "-N8MfBR4gu5G4kMF9fGW": {
        "dateAdded": 1659328311354,
        "date_time": "Aug-01-2022 12:31:51 AM",
        "from": "b3vYlKZFrje0e3wHyBlWIK4ooK93",
        "isSeen": false,
        "message": "Cool",
        "to": "DIt5bGqw2WS4eGHNqQJKxZSn3B72",
        "type": "text"
      },
      "-N8NCgnwX6V7ghfGlcWS": {
        "dateAdded": 1659337356887,
        "date_time": "Aug-01-2022 3:02:36 AM",
        "from": "DIt5bGqw2WS4eGHNqQJKxZSn3B72",
        "isSeen": false,
        "message": "Hello",
        "to": "b3vYlKZFrje0e3wHyBlWIK4ooK93",
        "type": "text"
      }
    }
  },

FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("Messages");
    Query query = usersRef.orderByChild("isSeen").equalTo(true);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {

                long count = ds.child(firebaseUser.getUid()).getChildrenCount();
                //Toast.makeText(MainActivity.this, "In here.", Toast.LENGTH_SHORT).show();
                //long count = ds.child("isSeen").getChildrenCount();
                Log.d("TAG", "Count:" + count);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage());
        }
    };
    query.addListenerForSingleValueEvent(valueEventListener);

尝试这个

Log.e(dataSnapshot.getKey(),dataSnapshot.getChildrenCount() + "");

我认为你应该试试这个,它对我有用。 它第一次阅读你的消息

usersRef.orderByChild("isSeen").equalTo(true).addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
     Log.d("TAG", "Count:" + String.valueOf(dataSnapshot.getChildrenCount()));
  }
  @Override
  public void onCancelled(DatabaseError databaseError) {        
  }
});

当您使用以下查询时:

Query query = usersRef.orderByChild("isSeen").equalTo(true);

Firebase 将始终返回您正在查询的确切数据,这意味着您将获得所有将isSeen字段设置为true的元素。 请注意,您无法通过否定进行查询。 所以这样的事情是不可能的:

Query query = usersRef.orderByChild("isSeen").notEqualTo(true);
//                                               👆

根据您的评论,您说您没有任何将isSeen字段设置为true的元素,那么您的查询将不会产生任何结果,这是预期的行为。

虽然@TimothyPham 的答案会起作用,但使用getChildrenCount()可能是最好的解决方案。 为什么? 因为如果您有很多消息,此操作需要您阅读所有消息才能提供数字。 我能想到的最好的解决方案是增加/减少一个计数器,正如我在以下帖子中的回答中所解释的那样:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM