(Android Firebase)确定分页时到达最后一项

时间:2018-08-02 01:59:06

标签: android firebase firebase-realtime-database

假设我在Firebase实时数据库中存储了100个项目(实际上实际上是100个项目)。因此,我决定使用分页,我使用Query#addValueEventListener()函数进行查询,每个请求仅加载20个项目,最后查询的项目的键传递给Query#startAt()以获取接下来的20个项目。到目前为止效果很好

但是问题是当我到达Firebase数据库中的最后一个项目(第100个项目)后,它将把我保留在数据库中的所有项目(100个项目)还给下一个请求。 当前,我必须检查传递给Query#startAt()的键ID,最后查询的项的键ID是否相等,如果为true,则到达末尾。老实说,我认为这不是一个很好的解决方案

因此,任何人在这种情况下都有更好的解决方案,请帮助我。 预先感谢!

此处的代码

private var lastKey: String? = null
fun requestItems(startAtId: String?){
    val query = dbRef.orderByKey()
    if(!startAtId.isNullOrBlank()){*the problem here*
        query.startAt(startAtId)
    }
    query.limitToFirst(10)
    query.addValueEventListener(object : ValueEventListener{
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            val lastKey = it.children.last().key
            if (lastKey.equals(startAtId)){
                //has reached the last item
                //ignore the result
            }else{
                //do something with the result
                lastKey = latestKey
            }
        }
        override fun onCancelled(dataSnapshot: DatabaseError) {

        }

    })

}

更新 我刚刚意识到我遇到的问题是在requestItems()函数中初始化Query对象(第一行到第五行)。它总是从db返回整个项目。我将初始化块更改为波纹管块。我和他们没什么不同,但是可以用作分页。

val query = if(startAtId.isNullOrBlank()){
        dbRef.orderByKey()
    }else{
        dbRef.orderByKey()
                .startAt(startAtId)

    }.limitToFirst(10)

但是仍然没有迹象表明它到达db中的最后一项。到达终点后,Firebase总是返回最后一项,我认为这是由于startAt(startAtId)函数引起的,并且没有像startAtAfter(startAtId)这样的函数

我将json file here附加到db中不是真实数据,但它们具有相同的结构。

1 个答案:

答案 0 :(得分:1)

Firebase Query对象是不可变的。每当您调用orderBystartAt和其他方法之一时,它都会返回一个新的Query对象。因此,您需要在变量中捕获该对象:

val query = dbRef.orderByKey()
if(!startAtId.isNullOrBlank()){
    query = query.startAt(startAtId)
}
query = query.limitToFirst(10)
...

这也是更新后的构造起作用的原因:您已将所有查询构造放入单个链中并捕获结果。但是,尽管可以正常工作,但我个人认为结果比上面的结果可读性差。