android - (android firebase)确定分页时到达最后一项
问题描述
假设我在 Firebase 实时数据库中存储了 100 个项目(实际上它比 100 多得多)。所以我决定使用分页,我使用 Query#addValueEventListener() 函数进行查询,每个请求只加载 20 个项目,最后一个查询项目的键传递给 Query#startAt() 以获取接下来的 20 个项目。到目前为止效果很好
但问题是,当我到达 Firebase 数据库中的最后一项(第 100 项)后,它会将数据库中的所有项目(100 项)归还给我,以供下一个请求。目前,我必须检查传递给 Query#startAt() 的密钥 id 和最后一个查询项目的密钥 id 是否相等,如果为真,那么我已经到达终点。老实说,我认为这不是一个很好的解决方案
所以这里的任何人都有更好的解决方案,请帮助我。提前致谢!
这里的代码
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 对象(第 1 行到第 5 行)。它总是从 db 返回整个项目。我将该初始化块更改为波纹管块。我不知道与他们有什么不同,但它起到了分页的作用。
val query = if(startAtId.isNullOrBlank()){
dbRef.orderByKey()
}else{
dbRef.orderByKey()
.startAt(startAtId)
}.limitToFirst(10)
但是仍然没有迹象表明它到达了 db 中的最后一项。到达终点后 Firebase 总是返回最后一项,我认为这是因为 startAt(startAtId) 函数而发生的,并且没有像 startAtAfter(startAtId) 这样的函数
我在此处附加了json 文件,它不是 db 中的真实数据,但它们具有相同的结构。
解决方案
FirebaseQuery
对象是不可变的。每当您调用orderBy
,startAt
和其他方法之一时,它都会返回一个新Query
对象。因此,您需要在变量中捕获该对象:
val query = dbRef.orderByKey()
if(!startAtId.isNullOrBlank()){
query = query.startAt(startAtId)
}
query = query.limitToFirst(10)
...
这也是您更新的构造起作用的原因:您已将所有查询构建放入一个链并捕获结果。但是虽然它有效,但我个人发现结果的可读性不如上面的结果。
推荐阅读
- c++ - 是否有像“AsDateTime”这样的函数将检索到的数据从 SQL Server 转换为时间?
- python - 裁剪列表中的字符串
- jpa - 使 JPA 外键作为实体中的主键
- python - Subprocess.run 在 CMD 中找不到文件,但在 IDE 中
- java - 如何将 Mat 转换为位图?(在 linux 上运行,而不是在 android 上运行)
- javascript - 单击时如何删除按钮
- php - 我想将“读取目录”代码从 php 转换为 python
- javascript - 有没有办法在谷歌地图回调中包含对象原型方法?
- google-app-engine - 在 AppEngine(Python) 中连接到 Google Cloud MySQL 数据库
- java - 如何将字符串拆分为整数、符号和字符串,然后存储整数值以用于算术运算