【问题标题】:Can I write Firestore query using if else statement? [duplicate]我可以使用 if else 语句编写 Firestore 查询吗? [复制]
【发布时间】:2020-04-12 20:12:46
【问题描述】:

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

所以我想从我的事件集合中搜索一个事件。可以根据过滤器搜索是否为免费事件,以及是否需要搜索特定的事件类型或显示所有事件而不考虑事件类型。

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

这里是我的方法的代码:

   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)
            }




    }

这是我的数据库截图

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

【问题讨论】:

  • 为什么说错了?什么没有按照您的预期工作?
  • 我的意思是,显示的文件与我预期的不一样。所以目前我试图调查我犯错的位置。我怀疑问题出在我编写查询的代码中。我不确定我编写这样的查询的方式是对还是错。我这样写代码的方式有效吗?
  • 请向我们提供一个特定查询的具体示例,该示例未返回您期望的结果。还请添加您的数据库结构作为屏幕截图。
  • @AlexMamo 我已经添加了完整的代码以及我的数据库截图
  • 哦,我现在明白了。我马上给你写一个答复。

标签: java android firebase google-cloud-firestore


【解决方案1】:

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

query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

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

query = query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

现在您的 query 将使用以下四个 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)

【讨论】:

    猜你喜欢
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2015-10-19
    相关资源
    最近更新 更多