【问题标题】:Retrieve count data from Firebase Java从 Firebase Java 中检索计数数据
【发布时间】:2022-08-14 05:21:21
【问题描述】:

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

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

规则:

{   
\"rules\": {     
  \".read\": true,     
    \".write\": true,     
      \"Messages\": {        
          \".indexOn\": \"isSeen\"       
       }     
  }   
} 

\"Messages\": {
\"b3vYlKZFrje0e3wHyBlWIK4ooK93\": {
  \"DIt5bGqw2WS4eGHNqQJKxZSn3B72\": {
    \"-N8NCgnwX6V7ghfGlcWS\": {
      \"dateAdded\": 1659337356887,
      \"date_time\": \"Aug-01-2022 3:02:36 AM\",
      \"from\": \"DIt5bGqw2WS4eGHNqQJKxZSn3B72\",
      \"isSeen\": true,
      \"message\": \"Yoo\",
      \"to\": \"b3vYlKZFrje0e3wHyBlWIK4ooK93\",
      \"type\": \"text\"
    },
    \"-N99iQjlMfeyOM_VCAEB\": {
      \"dateAdded\": 1660184797462,
      \"date_time\": \"Aug-10-2022 10:26:37 PM\",
      \"from\": \"DIt5bGqw2WS4eGHNqQJKxZSn3B72\",
      \"isSeen\": true,
      \"message\": \"Wassup\",
      \"to\": \"b3vYlKZFrje0e3wHyBlWIK4ooK93\",
      \"type\": \"text\"
    }
  }
}
},

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference(\"Messages\");
    Query query = usersRef.child(firebaseUser.getUid()).orderByChild(\"isSeen\").equalTo(true);
    query.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DataSnapshot> task) {
            if (task.isSuccessful()) {
                long count = task.getResult().getChildrenCount();
                Log.d(\"TAG1\", \"count: \" + count);
            } else {
                Log.d(\"TAG2\", task.getException().getMessage()); //Never ignore potential errors!
            }
        }
    });

错误信息:

D/TAG2: Index not defined, add \".indexOn\": \"isSeen\", for path \"/Messages/b3vYlKZFrje0e3wHyBlWIK4ooK93\", to the rules

Database schema

  • 你的isSeen 值是布尔值吗?还是一个字符串?如果isSeen 中存储的值是字符串,那么您需要使用字符串值而不是布尔值。 .equalTo(\"true\")
  • 这是一个布尔值@MarcAnthonyB
  • 您是否有任何将 isSeen 的值设置为 true 的记录?请使用@AlexMamo 回复
  • 不,这都是假的@AlexMamo
  • 如果一切都是假的,你如何期望得到结果?我不确定我是否理解问题所在。

标签: java android firebase google-cloud-platform firebase-realtime-database


【解决方案1】:

当您使用以下查询时:

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

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

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

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

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

编辑:

Query query = usersRef.orderByChild("isSeen").equalTo(true);
query.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            long count = task.getResult().getChildrenCount();
            Log.d("TAG", "count: " + count);
        } else {
            Log.d("TAG", task.getException().getMessage()); //Never ignore potential errors!
        }
    }
});

但是,只有当数据库中有将isSeen 字段设置为true 的元素时,此代码才有效。

【讨论】:

  • 我整天都在尝试@TimothyPham 的答案,但仍然一无所获。
  • 也试试我的方法。它是否返回isSeen 字段设置为true 的孩子的数量?
  • 添加侦听器行上的 get() 对我不起作用。我在您的其他答案之一中也看到了它并尝试了它,但它没有用。它显示为红色并要求我重命名引用。
  • 也许我正在使用不同版本的东西。
  • 是的,这就是问题所在。您使用的不是最新版本。更新它并告诉我它是否有效。
【解决方案2】:

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

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) {        
  }
});

【讨论】:

  • 计数应为 2 时仍返回为 0
【解决方案3】:

尝试这个:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多