Android Firebase实时数据库筛选嵌套列表中的数据

Android Firebase实时数据库筛选嵌套列表中的数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我想根据额外的值(如31)从数据库中检索过滤数据 我能够轻松检索完整数据,但无法将过滤器放入其中 注意:我已经检查了几乎所有的解决方案,如果重复请回复然后标记重复 我的代码是 DBConnection dbConnection=new DBConnection(); postRef=dbConnection.database.getReference("Data"); postRef.child("extra_Cat").orderByKey().equalTo

我想根据额外的值(如31)从数据库中检索过滤数据

我能够轻松检索完整数据,但无法将过滤器放入其中

注意:我已经检查了几乎所有的解决方案,如果重复请回复然后标记重复

我的代码是

 DBConnection dbConnection=new DBConnection();
        postRef=dbConnection.database.getReference("Data");
        postRef.child("extra_Cat").orderByKey().equalTo("*31*").limitToLast(500).addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                long as= dataSnapshot.getChildrenCount();
                Log.d("Data", String.valueOf(as));
            }
            @Override
            public void onCancelled(DatabaseError error) {
                // Failed to read value
            }
        });
JSON是


不能基于数组中存在的值创建查询。正如我在数据库中看到的,extraCat是一个数组,包含两个值,*31*和*14*

为了解决这个问题,您需要稍微更改一下数据库结构。因此,extraCat节点应如下所示:

extraCat
  |
  --- "*31*": true
  |
  --- "*14*": true
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Data")
    .orderByChild("extra_Cat/*31*")
    .equalsTo(true)
    .limitToLast(500)
    .addValueEventListener(/* ... */)
如您所见,extraCat节点现在是一个映射。相应的查询应如下所示:

extraCat
  |
  --- "*31*": true
  |
  --- "*14*": true
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Data")
    .orderByChild("extra_Cat/*31*")
    .equalsTo(true)
    .limitToLast(500)
    .addValueEventListener(/* ... */)

不能基于数组中存在的值创建查询。正如我在数据库中看到的,extraCat是一个数组,包含两个值,*31*和*14*

为了解决这个问题,您需要稍微更改一下数据库结构。因此,extraCat节点应如下所示:

extraCat
  |
  --- "*31*": true
  |
  --- "*14*": true
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Data")
    .orderByChild("extra_Cat/*31*")
    .equalsTo(true)
    .limitToLast(500)
    .addValueEventListener(/* ... */)
如您所见,extraCat节点现在是一个映射。相应的查询应如下所示:

extraCat
  |
  --- "*31*": true
  |
  --- "*14*": true
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("Data")
    .orderByChild("extra_Cat/*31*")
    .equalsTo(true)
    .limitToLast(500)
    .addValueEventListener(/* ... */)

首先,您使用了错误的参考路径。您当前使用的是Data/extra_cat。正如我在Firebase结构中看到的,它应该是Data/32343/extraCat。
不能使用.childextra_Cat.orderByKey.equalTo*31*,因为*31*不是extra_Cat keys值。该值在列表中

首先,您使用了错误的参考路径。您当前使用的是Data/extra_cat。正如我在Firebase结构中看到的,它应该是Data/32343/extraCat。
不能使用.childextra_Cat.orderByKey.equalTo*31*,因为*31*不是extra_Cat keys值。该值在列表中

一个额外的问题:它检索500个条目,然后针对特定类别进行筛选,但我想要500个该猫的条目。是否可以在这里进行筛选,或者我必须在其他地方进行筛选?不,您针对特定类别进行筛选,然后根据该类别获得这500个条目。只能根据一个类别进行筛选。Firebase不允许您基于多个类别进行筛选。不,您搞错了,使用此代码,我只得到200个检索500个条目,然后筛选31个条目,我认为是这样,因为在最后500个条目中,300个来自不同的类别,这是我想要500个条目和31个条目。请注意,为了使此解决方案有效工作,您需要在extra_Cat上的每个子级上定义一个索引。因为这需要修改每个类别的安全规则,所以通常是不可行的。相反,我建议存储额外的数据以允许反向查找。有关详细信息,请参见我的回答:@FrankvanPuffelen我试图使用现有的数据库结构解决OP的问题。存储额外数据以允许反向查找,这始终是一个不错的选择。也许我应该首先推荐它。再次感谢你的评论,弗兰克。还有一个问题:它检索500个条目,然后针对特定类别进行筛选,但我想要500条该猫的条目。是否可以在这里进行筛选,或者我必须在其他地方进行筛选?否,您针对特定类别进行筛选,然后根据该类别获得这500条条目。只能根据一个类别进行筛选。Firebase不允许您基于多个类别进行筛选。不,您搞错了,使用此代码,我只得到200个检索500个条目,然后筛选31个条目,我认为是这样,因为在最后500个条目中,300个来自不同的类别,这是我想要500个条目和31个条目。请注意,为了使此解决方案有效工作,您需要在extra_Cat上的每个子级上定义一个索引。因为这需要修改每个类别的安全规则,所以通常是不可行的。相反,我建议存储额外的数据以允许反向查找。有关详细信息,请参见我的回答:@FrankvanPuffelen我试图使用现有的数据库结构解决OP的问题。存储额外数据以允许反向查找,这始终是一个不错的选择。也许我应该首先推荐它。再次感谢你的评论,弗兰克。