Java Firebase中的过滤查询

Java Firebase中的过滤查询,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,在我的应用程序中,我有一个片段,允许用户对他想看的国家进行过滤搜索。 看起来是这样的(用户选择他想要查看的国家的大陆,然后这些大陆的所有国家都出现): 我正在使用Firebase实时数据库保存所有国家的名称和每个国家的图像。这就是我的JSON树的样子(并非此处显示的所有国家): (顺便说一句,我很抱歉,因为这都是葡萄牙语): 我目前可以显示特定大陆的所有国家,但如果用户选择多个大陆,我无法查询所有国家。。。 这是我目前必须执行的代码: DatabaseReference paisNomeC

在我的应用程序中,我有一个片段,允许用户对他想看的国家进行过滤搜索。 看起来是这样的(用户选择他想要查看的国家的大陆,然后这些大陆的所有国家都出现):

我正在使用
Firebase实时数据库
保存所有国家的名称和每个国家的图像。这就是我的JSON树的样子(并非此处显示的所有国家): (顺便说一句,我很抱歉,因为这都是葡萄牙语):

我目前可以显示特定大陆的所有国家,但如果用户选择多个大陆,我无法查询所有国家。。。 这是我目前必须执行的代码:

 DatabaseReference paisNomeContinentes = mDatabase.child("continentes").child(Constants.PAISES_EUROPA).child("Paises");             // C1 - ÁFRIA        (Constants.PAISES_AFRICA)
    ValueEventListener valueEventListener1 = new ValueEventListener() {                                                          // C2 - ÁSIA         (Constants.PAISES_ASIA)
        @Override                                                                                                               // C3 - ANTÁRTIDA    (Constants.PAISES_ANTARTIDA)
        public void onDataChange(DataSnapshot dataSnapshot) {                                                                   // C4 - AMÉRICA      (Constants.PAISES_AMERICA)
            List<String> nomePaisList = new ArrayList<>();                                                                     // C5 - EUROPA       (Constants.PAISES_EUROPA)
                                                                                                                               // C6 - OCEANIA      (Constants.PAISES_OCEANIA)
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String nomePais = ds.child("Nome").getValue(String.class);
                nomePaisList.add(nomePais);
            }

            int urlCount = nomePaisList.size();
            int randomNumber = new Random().nextInt(urlCount);
            List<String> randomNomePaisList = new ArrayList<>();
            for (int i=0; i<=9; i++) {
                randomNomePaisList.add(nomePaisList.get(randomNumber));
                txtHomeDesc.setText(randomNomePaisList.get(i)); // Inserir na TextView o nome do respetivo país
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    paisNomeContinentes.addListenerForSingleValueEvent(valueEventListener1);
DatabaseReference paisnomecontinets=mDatabase.child(“大陆”).child(Constants.PAISES_EUROPA).child(“PAISES”);//C1-非洲(非洲)
ValueEventListener valueEventListener1=新的ValueEventListener(){//C2-ÁSIA(Constants.PAISES_ASIA)
@重写//C3-ANTÁRTIDA(Constants.PAISES_ANTARTIDA)
公共无效数据变更(数据快照数据快照){//C4-美国(Constants.PAISES_AMERICA)
List nomePaisList=new ArrayList();//C5-EUROPA(Constants.PAISES_EUROPA)
//C6-大洋洲(常数:PAISES_OCEANIA)
对于(DataSnapshot ds:DataSnapshot.getChildren()){
字符串nomePais=ds.child(“Nome”).getValue(String.class);
nomePais列表。添加(nomePais);
}
int urlCount=nomePaisList.size();
int randomNumber=new Random().nextInt(urlCount);
List randomNomePaisList=新建ArrayList();

对于(int i=0;i,可以有多种方法来实现这一点。其中一种方法如下所示-

String nomePais;
String nome;
List<String> nomePaisList;
DatabaseReference paisNomeContinentes = mDatabase.child("Continente").child(Constants.PAISES_EUROPA).child("Paises");             // C1 - ÁFRIA        (Constants.PAISES_AFRICA)
    ValueEventListener valueEventListener1 = new ValueEventListener() {                                                          // C2 - ÁSIA         (Constants.PAISES_ASIA)
        @Override                                                                                                               // C3 - ANTÁRTIDA    (Constants.PAISES_ANTARTIDA)
        public void onDataChange(DataSnapshot dataSnapshot) {                                                                   // C4 - AMÉRICA      (Constants.PAISES_AMERICA)
                                                                               // C5 - EUROPA       (Constants.PAISES_EUROPA)
                                                                                                                               // C6 - OCEANIA      (Constants.PAISES_OCEANIA)
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                nomePais = ds.child("Continente").getValue(String.class);
                if(nomePais.equals("AMERICA") || nomePais.equals("EUROPIA") {
                    nome = nomePais;
                    fetch(nome);
                 } // Suppose user selects continent AMERICA & EUROPIA
            }

void fetch(String n) {
   Query paisNome = mDatabase.child("continentes").child(Constants.PAISES_EUROPA).child("Paises").child("P;             1").child("Nome").equalTo(n);
   ValueEventListener valueEventListener1 = new ValueEventListener() {                                                          
    @Override                                                                                                               
    public void onDataChange(DataSnapshot dataSnapshot) {                                                                   
        nomePaisList = new ArrayList<>();                                                                     
        nome = dataSnapshots.getValue().toString();
        nomePaisList.add(nome);

    }
}
字符串名称;
字符串名称;
名单;
DatabaseReference paisnomecontinets=mDatabase.child(“大陆”).child(Constants.PAISES_EUROPA).child(“PAISES”);//C1-ÁFRIA(Constants.PAISES_AFRICA)
ValueEventListener valueEventListener1=新的ValueEventListener(){//C2-ÁSIA(Constants.PAISES_ASIA)
@重写//C3-ANTÁRTIDA(Constants.PAISES_ANTARTIDA)
公共无效数据变更(数据快照数据快照){//C4-美国(Constants.PAISES_AMERICA)
//C5-欧罗巴(常数:PAISES_EUROPA)
//C6-大洋洲(常数:PAISES_OCEANIA)
对于(DataSnapshot ds:DataSnapshot.getChildren()){
nomePais=ds.child(“大陆”).getValue(String.class);
如果(诺梅帕斯等于(“美国”)| |诺梅帕斯等于(“欧洲”){
nome=nomePais;
取回(nome);
}//假设用户选择美洲大陆和欧洲大陆
}
无效提取(字符串n){
查询paisNome=mDatabase.child(“大陆”).child(Constants.PAISES_EUROPA).child(“PAISES”).child(“P;1”).child(“Nome”).equalTo(n);
ValueEventListener valueEventListener1=新的ValueEventListener(){
@凌驾
public void onDataChange(DataSnapshot DataSnapshot){
nomePaisList=新的ArrayList();
nome=dataSnapshots.getValue().toString();
名称列表。添加(nome);
}
}

我希望这能有所帮助……

我想到的第一件事是有多个查询(每个选定的洲一个查询)结合结果。@AndréKool我也想到了这一点,我只是不知道这是否是最简单/最好的方法。因为你已经在一个大陆上使用了它,而且firebase实时数据库中没有类似OR查询的东西,我认为这将是最简单的解决方法(对你来说)。您还可以查看有关查询firebase的更多想法。实际上,该代码来自我的另一个构建firebase实时数据库的测试。这是我用于该代码工作的结构:根据我在问题中得到的结构,我如何能够检索每个大陆的信息?如果你可以对你的答案进行解释。