【问题标题】:Android firebase method chaining with conditions带有条件的Android firebase方法链接
【发布时间】:2018-06-19 09:24:12
【问题描述】:

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

对吗?还是有更聪明的方法来做到这一点?

【问题讨论】:

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


    【解决方案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();
                                            }
        }
    });
    

    【讨论】:

      【解决方案2】:

      对吗?

      是的。根据the official Firebase Documentation,这是正确的做法,因为您只是在进行“equalTo”比较。该文档以示例为例:

      citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
      

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

      【讨论】:

        猜你喜欢
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 2023-01-16
        • 2020-11-14
        • 2011-07-05
        相关资源
        最近更新 更多