<分区>
我想构建一个可以适应所有查询情况的方法。
所以我想从我的 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)
}
}
这是我的数据库的截图
我想我可以像那样链接查询,但结果很奇怪。无论我选择过滤器,说我只想显示免费事件或只显示音乐事件(事件类型),结果似乎总是显示集合中的所有事件,并且分页也失败,似乎永无止境。