java - 我可以使用 if else 语句编写 Firestore 查询吗?

标签 java android firebase google-cloud-firestore

<分区>

我想构建一个可以适应所有查询情况的方法。

所以我想从我的 Activity 集合中搜索一个 Activity 。可以根据过滤器搜索是否是免费 Activity ,是否需要搜索特定的 Activity 类型或显示所有 Activity ,无论 Activity 类型如何。

我假设我可以构建这样的查询,但结果是错误的。我写查询的方式对吗?

这里是我的方法的代码:

   fun searchEventByParameters(onlyFreeEvents: Boolean, startDate: Date, endDate: Date, selectedCity: String, selectedEventType: String, limit: Long, lastDocument: DocumentSnapshot?, completion: (errorMessage:String?, events: ArrayList<Event>?, lastDocument: DocumentSnapshot?) -> Unit) {

        val ref = db.collection("events")
        lateinit var query : Query

        query = ref
            .whereEqualTo(FIRESTORE_EVENT_FIELD_CITY,selectedCity)
            .whereEqualTo(FIRESTORE_EVENT_FIELD_IS_ACTIVE,true)
            .whereEqualTo(FIRESTORE_EVENT_FIELD_HAS_BEEN_APPROVED,true)


        if (onlyFreeEvents) {
            query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)
        }

        if (selectedEventType == "show specific event type") {
            query.whereEqualTo(FIRESTORE_EVENT_FIELD_EVENT_TYPE, selectedEventType)
        }

        query.whereGreaterThan(FIRESTORE_EVENT_FIELD_DATE_START_TIME,startDate)
            .whereLessThan(FIRESTORE_EVENT_FIELD_DATE_START_TIME,endDate)
            .orderBy(FIRESTORE_EVENT_FIELD_DATE_START_TIME, Query.Direction.ASCENDING)
            .limit(limit)

        if (lastDocument != null) {
            query.startAfter(lastDocument)
        }



        query.get()
            .addOnSuccessListener { snapshot ->

                val eventDocuments = snapshot.documents

                if (eventDocuments.isEmpty()) {

                    completion("Tidak ada event",null,null)

                } else {

                    val lastDocument = snapshot.documents.last()
                    val eventArray = ArrayList<Event>()

                    for (document in eventDocuments) {
                        val eventData = document.data
                        val event = Event(dataEvent = eventData)
                        eventArray.add(event)
                    }

                    completion(null,eventArray,lastDocument)

                }



            }.addOnFailureListener {
                completion(it.localizedMessage,null, null)
            }




    }

这是我的数据库的截图

enter image description here

我想我可以像那样链接查询,但结果很奇怪。无论我选择过滤器,说我只想显示免费事件或只显示音乐事件(事件类型),结果似乎总是显示集合中的所有事件,并且分页也失败,似乎永无止境。

最佳答案

Cloud Firestore 查询是不可变的!这意味着您不能更改现有查询的属性。例如,如果您通过调用更改值:

query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

它成为一个新的查询。所以要解决这个问题,需要将新查询保存在原始对象中:

query = query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

现在您的查询 将使用以下四个whereEqualTo() 累积调用来过滤元素:

.whereEqualTo(FIRESTORE_EVENT_FIELD_CITY,selectedCity)
.whereEqualTo(FIRESTORE_EVENT_FIELD_IS_ACTIVE,true)
.whereEqualTo(FIRESTORE_EVENT_FIELD_HAS_BEEN_APPROVED,true)
.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

关于java - 我可以使用 if else 语句编写 Firestore 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59423129/

相关文章:

java - 小阵列有问题

android - 打开/qemu.conf失败,错误: 2

android - 不断在build.gradle中更改版本的firebase-core。包括firebase-core的最佳方法?

AngularJS 将逻辑放在服务中而不是 Controller 中,最佳实践

java - 访问 Tomcat Web 管理器时连接超时

java - 设置 Eclipse 动态 Web 应用程序时出现 404

android - 如何通过 Espresso android.widget.TextView setError 进行测试?

android - 使用 expo build 读取 ECONNRESET

java - 如何在 Android Studio Java 中将数组上传到 Firestore 数据

java - 自动从 pdf 中提取许多文件的文本