如何在Kotlin中为Firestore的Filter.or/Filter.and创建筛选器列表
解决Firestore Kotlin中动态构建Filter.or查询的问题
你遇到的问题核心是Kotlin处理Java可变参数方法的语法差异。Java中Filter.or(Filter... filters)是可变参数方法,在Kotlin中需要通过数组展开操作符来传递List中的筛选器,而非强制类型转换。
修改后的可运行代码如下:
val filterListForOr = mutableListOf<Filter>() if (isColorAFilteringCondition) { filterListForOr.add(Filter.equalTo("color", "red")) } if (isShapeAFilteringCondition) { filterListForOr.add(Filter.equalTo("shape", "circle")) } // 避免空筛选器列表导致异常 val query = if (filterListForOr.isNotEmpty()) { // 将List转为数组后用*展开,适配可变参数要求 db.collection("toyBlock").where(Filter.or(*filterListForOr.toTypedArray())) } else { // 无筛选条件时返回整个集合的查询,可根据业务需求调整 db.collection("toyBlock") } val querySnapshot: QuerySnapshot? = runCatching { query.get().await() }.onFailure { e -> println(e) }.getOrNull()
关键说明:
- Kotlin调用Java的可变参数方法时,必须先将List转为对应类型的数组(
toTypedArray()),再用*操作符展开数组元素,作为可变参数传入Filter.or - 必须处理空列表的情况:如果
filterListForOr为空,直接调用Filter.or()会抛出非法参数异常,因此需要分支处理空条件场景
内容的提问来源于stack exchange,提问作者Al Pacino
相关产品推荐
相关产品推荐

