Android firebase方法与条件链接

时间:2018-06-19 09:24:12

标签: java android function firebase google-cloud-firestore

我知道这是一个愚蠢的问题,但我需要知道我是否正确行事。我正在使用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)

是对的?或者有一种更聪明的方法可以做到这一点?

2 个答案:

答案 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")

但是,如果要使用范围进行查询,则应阅读有关复合查询的部分,因为这样做不是正确的方法。