Xar*_*mer 2 kotlin firebase google-cloud-firestore
有没有办法在 documentID 之后获取文档,例如
private fun fetchCollectoionnAfterDocumentID(limit :Long){
val db = FirebaseFirestore.getInstance()
var query:Query = db.collection("questionCollection")
.startAfter("cDxXGLHlP56xnAp4RmE5") //
.orderBy("questionID", Query.Direction.DESCENDING)
.limit(limit)
query.get().addOnSuccessListener {
var questions = it.toObjects(QuestionBO::class.java)
questions.size
}
}
Run Code Online (Sandbox Code Playgroud)
我想在给定的Document ID之后获取排序的问题。我知道我可以使用DocumentSnapShot. 为了第二次或在应用程序恢复后获取,我必须将其保存DocumentSnapshot在首选项中。
可以在文档 ID 之后获取吗?
startAfter - > cDxXGLHlP56xnAp4RmE5
编辑
我知道我可以使用lastVisible DocumentSnapshot做到这一点。但我必须将lastVisible DocumentSnapshot保存在sharedPreference.
当应用程序首次启动时,从questionCollection中获取 10 个问题。下次必须在这些之后再提取 10 个问题lastVisible。因此,为了获取下一个 10,我必须将 DocumentSnapshot 对象保存在 sharedPreference 中。在看到我的数据库结构后建议我一个更好的方法。
还有一件事 questionID 与文档参考 ID 相同。
您无法仅将文档 id 传递给startAfter()方法并简单地从该特定 id 开始,您应该传递一个DocumentSnapshots对象,如有关Firestore 分页的官方文档中所述:
使用批次中的最后一个文档作为下一个批次的光标开始。
first.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
=// Get the last visible document
DocumentSnapshot lastVisible = documentSnapshots.getDocuments()
.get(documentSnapshots.size() -1);
// Construct a new query starting at this document,
Query next = db.collection("cities")
.orderBy("population")
.startAfter(lastVisible) //Pass the DocumentSnapshot object
.limit(25);
// Use the query for pagination
}
});
Run Code Online (Sandbox Code Playgroud)
看,这里lastVisible是一个DocumentSnapshot代表最后一个可见对象的对象。您不能只传递文档 ID。有关更多信息,您可以从以下帖子中查看我的答案:
它是用 Java 编写的,但我相信您可以理解它并用 Kotlin 编写它。
编辑:
请考虑定义您的结果的顺序,以便您的所有数据页面都可以以可预测的方式存在。因此,您需要指定一个startAt()/startAfter()值来指示在排序中的哪个位置开始接收已订购的文档,或者使用 aDocumentSnapshot来指示要接收的下一个文档,如上所述。
另一种解决方案可能是将文档 id 放入文档本身(作为属性的值)并对其进行排序,或者您可以使用FieldPath.documentId()id 进行排序而无需添加。
有一种方法可以让 startAfter(documentID) 起作用。
再创建一个文档“get”,然后使用结果作为 startAfter 输入。
val db = FirebaseFirestore.getInstance()
// I use javascript await / async here
val afterDoc = await db.collection("questionCollection").doc("cDxXGLHlP56xnAp4RmE5").get();
var query:Query = db.collection("questionCollection")
.startAfter(afterDoc)
.orderBy("questionID", Query.Direction.DESCENDING)
.limit(limit)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1340 次 |
| 最近记录: |