Firestore分页:使用DocumentSnapshot进行StartAfter查询后无法正常工作

时间:2019-09-14 07:17:46

标签: android firebase kotlin google-cloud-firestore

我在firestore数据库中保存了一份要约/交易清单。我想按降序获取按折扣排序的前3个交易,即折扣最高的交易排在第一位,然后是第二高的交易,依此类推。我正在以3的段来获取它们。

How i sorted them firebase console

My sorted database based on discount

我正在尝试使用android代码实现相同的目的。因此,应首先对折价55,44,28的前三个元素进行排序,然后对27,27,21进行折扣,最后对19,4进行折扣。

class ContentGenerationActivityV1 : AppCompatActivity() {

     var lastDocument : DocumentSnapshot?= null
     lateinit var filterQuery: Query

     override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_content_generation)

        val doc = FirebaseFirestore.getInstance().collection("steal-deals").document("deals")

       filterQuery = doc.collection(getTodayTimeStamp().toString())
        .orderBy("discount", Query.Direction.DESCENDING)

       filterFetchButton.setOnClickListener {
           if(lastDocument == null){
              fetchFirstFew()
           } else {
            fetchMore()
        }
    }
}

//Get first 3 elements
fun fetchFirstFew(){

    Log.d("N/W CALL ::", "FIRST")

    filterQuery.limit(3) .get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }

        }


}

//Get the next 3 elements
fun fetchMore(){

    Log.d("N/W CALL ::", "SECOND")

    filterQuery.startAfter(lastDocument)
        .limit(3).get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }


        }
}

但是无论如何,它总是返回前三个元素(55、44、28)。enter image description here

请指导我,以达到同样的目的。

2 个答案:

答案 0 :(得分:0)

我刚遇到这个问题。

reference

所以,在您的代码中

错误:

filterQuery.limit(3) .get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }

        }

是:

filterQuery = filterQuery.limit(3) .get()
        .addOnSuccessListener { result ->

            lastDocument = result.documents.last()

            for (document in result) {
                Log.d("DEAL :: ", "${document.id} => ${document.data}")
            }

        }

因为链接到查询时,它将创建并返回一个新查询,该查询在提供的文档(不包括)之后开始。所以你必须重新分配它!

如果对您有好处,请投票支持!

答案 1 :(得分:0)

我遇到了同样的问题,但是经过一些研究发现,“ startAfter(lastDocument)”返回了一个新的Query实例,您需要获取该实例,并在该实例上调用限制。

val query = filterQuery.startAfter(lastDocument)
query.limit(3).get().addOnSuccessListener {}