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