![](/img/trans.png)
[英]Firestore pagination startAfter(DocumentSnapshot) working in java but not in kotlin
[英]Firestore Pagination : StartAfter query with DocumentSnapshot not working
我的 firestore 数据库中保存了一份报价/交易列表。 我想获取按降序折扣排序的前 3 笔交易,即折扣最高的交易排在第一位,然后是次高的,依此类推。 我以 3 段的形式获取它们。
我正在尝试使用 android 代码实现相同的目的。 因此,折扣为 55、44、28 的前 3 个元素应该首先出现,然后是 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}")
}
}
}
请指导我实现同样的目标。
我遇到了同样的问题,但经过一些研究发现“startAfter(lastDocument)”返回一个新的查询实例,您需要获取该实例,并且您需要调用limit。
val query = filterQuery.startAfter(lastDocument)
query.limit(3).get().addOnSuccessListener {}
我刚收到这个问题。
所以,在你的代码中
错误的:
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}")
}
}
因为当您链接到查询时,它会创建并返回一个在提供的文档(独占)之后开始的新查询。 所以你必须重新分配它!
除了在单独的引用中存储查询 object 之外,您还需要确保将非空lastDocument 传递给 startAfter。 您可以将其转换为文档快照或将 !! 在可变端
filterQuery.startAfter(lastDocument!!)
.limit(3).get()
或者
filterQuery.startAfter(lastDocument as DocumentSnapshot)
.limit(3).get()
它一定会起作用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.