我知道这是一个愚蠢的问题,但我需要知道我是否正确行事。我正在使用firebase firestore数据库存储在我的Android应用程序中排序和过滤的属性数据。用户可以根据区域过滤这些属性,即如果他选择特定区域,则仅列出那些区域的属性,如果他选择“全部”,则将列出所有属性。我通过以下代码实现了这个逻辑: -
private void updateListViewOldest(String city, String area, Long type) {
final ArrayList<PropertyListObject> objects = new ArrayList<>();
FirebaseFirestore db = FirebaseFirestore.getInstance();
if (area.equals("All")) {
db.collection("Properties")
.orderBy("postTime", Query.Direction.ASCENDING)
.whereEqualTo("city", city)
.whereEqualTo("type", type)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
propertyListPosition.add(document.getId());
PropertyFetchObject pfo = document.toObject(PropertyFetchObject.class);
objects.add(new PropertyListObject(pfo.getPrice(), pfo.getName(), pfo.getArea(), pfo.getSize(), getTime(pfo.getPostTime()), pfo.getCity()));
}
PropertiesListAdapter propertyAdapter = new PropertiesListAdapter(PropertyAds.this, objects);
adsListView.setAdapter(propertyAdapter);
} else {
Toast.makeText(PropertyAds.this, "error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
} else {
db.collection("Properties")
.orderBy("postTime", Query.Direction.ASCENDING)
.whereEqualTo("city", city)
.whereEqualTo("type", type)
.whereEqualTo("area", area) // just added this
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
propertyListPosition.add(document.getId());
PropertyFetchObject pfo = document.toObject(PropertyFetchObject.class);
objects.add(new PropertyListObject(pfo.getPrice(), pfo.getName(), pfo.getArea(), pfo.getSize(), getTime(pfo.getPostTime()), pfo.getCity()));
}
PropertiesListAdapter propertyAdapter = new PropertiesListAdapter(PropertyAds.this, objects);
adsListView.setAdapter(propertyAdapter);
} else {
Toast.makeText(PropertyAds.this, "error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
}
}
仅为行
再次编写整个代码.whereEqualTo(“area”,area)
是对的?或者有一种更聪明的方法可以做到这一点?
答案 0 :(得分:1)
如果您将查询的构建与侦听器的附加功能分开,则看起来您的代码可能会简单得多。
FirebaseFirestore db = FirebaseFirestore.getInstance();
Query query = db.collection("Properties")
.orderBy("postTime", Query.Direction.ASCENDING)
.whereEqualTo("city", city)
.whereEqualTo("type", type)
if (!area.equals("All")) {
query = query.whereEqualTo("area", area);
}
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
propertyListPosition.add(document.getId());
PropertyFetchObject pfo = document.toObject(PropertyFetchObject.class);
objects.add(new PropertyListObject(pfo.getPrice(), pfo.getName(), pfo.getArea(), pfo.getSize(), getTime(pfo.getPostTime()), pfo.getCity()));
}
PropertiesListAdapter propertyAdapter = new PropertiesListAdapter(PropertyAds.this, objects);
adsListView.setAdapter(propertyAdapter);
} else {
Toast.makeText(PropertyAds.this, "error: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
答案 1 :(得分:0)
是不是?
是。根据{{3}},这是正确的方法,因为你只是在做同等的事情。比较。该文档给出了一个例子:
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
但是,如果要使用范围进行查询,则应阅读有关复合查询的部分,因为这样做不是正确的方法。