ListView отображает все данные из Firebase проблема

#android #firebase #listview #firebase-realtime-database #spinner

#Android #firebase #listview #firebase-база данных в реальном времени #счетчик

Вопрос:

Я создал счетчик, который содержит список секторов, и при выборе одного из них он должен отображать элементы, принадлежащие этому конкретному сектору, я думаю, что есть проблема с моим запросом, который извлекает данные из базы данных firebase в реальном времени, поскольку он возвращает все элементы в списке

древовидный вид

Просмотр списка эмуляторов

При создании кода

  FirebaseApp.initializeApp(this);
    listView = findViewById(R.id.listView);

    spnSector = findViewById(R.id.spnSector);

    ArrayAdapter<CharSequence> adapter1 = ArrayAdapter.createFromResource(this,
            R.array.sector_array, android.R.layout.simple_spinner_item);

    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    spnSector.setAdapter(adapter1);

    spnSector.setOnItemSelectedListener(this);
  

Класс местоположения

 public class Location {

public String sector;
public String area;

public double longitude;
public double latitude;

public String getSector() {
    return sector;
}

public String getArea() {
    return area;
}

public double getLongitude() {
    return longitude;
}

public double getLatitude() {
    return latitude;
}

public Location()
{

}

public Location(String sector , String area, double longitude, double latitude)
{
    this. sector = sector;
    this. area = area;
    this.longitude = longitude;
    this.latitude = latitude;
}

@Override
public String toString() {
    return "n Sector='"   sector   '''  
            ",Area Name='"   area   '''  
            ",Longitude='"   longitude   '''  
            ",Latitude="   latitude   "n";

}
  

Класс Case

     public class Case {

    private String caseName;
    private String date;
    private String caseStatus;
    private Location location;

    public String getDate() {
        return date;
    }

    public String getCaseName() {
        return caseName;
    }

    public String getCaseStatus() {
        return caseStatus;
    }

    public Location getLocation() {
        return location;
    }

    public Case() {
    }


    public Case(String caseName,String date, String caseStatus , Location location) {
        this.caseName = caseName;
        this.date = date;
        this.caseStatus = caseStatus;
        this.location = location;
    }

    @Override
    public String toString() {
        return "nCase Date="   date   "n"  
                "Area="   location.area   "n"  
                "Latitude="   location.latitude   "n"  
                "Longitude="   location.longitude   "n" 
                "Sector="   location.sector   "n"  
                "Status="   caseStatus   "n"  
                "Case name="   caseName   "n" ;


    }
}
  

Метод поискового запроса

  public void doSearch3(View view) {

    String sector = spnSector.getSelectedItem().toString();

    final ArrayList<Case> cases = new ArrayList<>();


    final ArrayAdapter adapter = new ArrayAdapter<> (SearchCase.this, android.R.layout.simple_list_item_1, cases);

    databaseReference = FirebaseDatabase.getInstance().getReference();

    Query query = databaseReference.child("/Cases");
    query.orderByChild("/location/sector").equalTo(sector);
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()){

                Case case1 = ds.getValue(Case.class);
                cases.add(case1);

            }
            listView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });



}
  

Я смог сделать это с помощью firestore, но я должен сделать это в режиме реального времени, я думаю, что запрос неверен

Ответ №1:

Методы построения запросов, такие как orderByChild и equalTo возвращают новый Query объект, поэтому вам необходимо обновить query переменную, чтобы ссылаться на этот новый объект.

 Query query = databaseReference.child("/Cases");
query = query.orderByChild("/location/sector").equalTo(sector);
query.addValueEventListener(new ValueEventListener() {
  

Комментарии:

1. спасибо, что указали на это, оказывается, это была проблема

Ответ №2:

Измените это:

 databaseReference = FirebaseDatabase.getInstance().getReference();

    Query query = databaseReference.child("/Cases");
    query.orderByChild("/location/sector").equalTo(sector);
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()){

                Case case1 = ds.getValue(Case.class);
                cases.add(case1);

            }
            listView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
  

для этого:

 databaseReference = FirebaseDatabase.getInstance().getReference();

    Query query = databaseReference.child("/Cases");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()){
             if (ds.child("location").child("sector").getValue(String.class).equals(sector)){
                Case case1 = ds.getValue(Case.class);
                cases.add(case1);
   }

                

            }
            listView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });