【发布时间】: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