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实时数据库的测试。这是我用于该代码工作的结构:根据我在问题中得到的结构,我如何能够检索每个大陆的信息?如果你可以对你的答案进行解释。