当前位置: 首页 > 知识库问答 >
问题:

Android-Firest返回一个空的查询,使用的是开始后()和限制()

何琨
2023-03-14

我正在尝试使用Firebase Fireresstart()和限制()查询方法实现分页系统,第一个查询返回成功,但第二个查询返回空快照。

>

fun getNextPage(paginationSize : Long) : TrendingRepository {
database.collection("app")
    .document("data")
    .collection("offers")
    .orderBy("discount")
    .startAfter(lastVisible)
    .limit(paginationSize)
    .get().addOnSuccessListener { snapshot ->

        Log.i("TrendingRepo", "pagination size : $paginationSize")
        val newList = ArrayList<Offer>()

        if (!snapshot.isEmpty) {
            lastVisible = snapshot.documents[snapshot.size() - 1]
        }

        for (document in snapshot) {
            val item = document.toObject(Offer::class.java)
            newList.add(item)
            Log.i("TrendingRepo", "at position: ${newList.indexOf(item)} got item: ${item.id}")
        }

        successListener?.onSuccess(newList)

    }.addOnFailureListener {
        failureListener?.onFailure(it.localizedMessage)
    }

return this
}

这是我的日志:

TrendingRepo:分页大小:48//第一次尝试

TrendingRepo:在位置:0获得项目:0pqcRzSd06WWlNNmcolu

趋势回购:在位置:1得到项目:7I7WISYT5YEBWNWN08BQJ

...

TrendingRepo:在位置: 45得到项目: 4B3dEPhFLqhKrYpLWye7

TrendingRepo:在位置: 46得到项目: 4ddLqiGe8ReXW8SKq2Q6

TrendingRepo:at位置:47获得项目:4UVNNGNAMKVGUHCV01N

TrendingRepo:分页大小:48//第二次尝试

//不再记录,数据为空

共有1个答案

宇文俊明
2023-03-14

可能存在项目小于分页大小的情况,因此下面是代码

private var lastVisible: DocumentSnapshot? = null
private var isLastPage: Boolean = false
private var isDocEmpty: Boolean = false

var ref: Task<QuerySnapshot>? = null

 if (lastVisible != null) {
ref = database.collection("app").document("data").collection("offers").orderBy("discount").startAfter(lastVisible).limit(paginationSize).get()
 } else {
ref = database.collection("app").document("data").collection("offers").orderBy("discount").limit(paginationSize).get()
 }


 ref.addOnSuccessListener { documents ->

            hideProgress()
            isDocEmpty = documents.isEmpty



            if (!isDocEmpty) {
                lastVisible = documents.last()
                isLastPage = documents.size() < paginationSize
            }

            isLoading = false
        }
            .addOnFailureListener { exception ->
                Log.w("TAG", "Error getting documents: ", exception)
                isLoading = false
                hideProgress()
            }

我希望这对你有帮助。

 类似资料:
  • 在我的Android项目中,我使用Room库来处理SQLite数据库。我使用我的数据库来保存国家电话代码。我的数据库预加载了两个国家(watch大众数据库与国家代码(道:电话代码道)功能); 国家代码实体 DAO接口 在我的应用程序中,我按顺序选择国家代码(观察函数selectCountryCodeByOrder(order:Int):Int)。我在异步{}协同例程中异步调用此函数。但我有一个相当

  • 问题内容: 我正在使用MySQL存储视频游戏数据。我有用于标题,平台,标签,徽章,评论,开发人员,出版商等的表… 当某人正在观看游戏时,最好有一个查询来返回与游戏相关的所有数据,还是最好使用多个查询?直观地,由于我们具有评论,将它们包括在同一查询中似乎毫无意义,因为它们需要分页。但是在其他情况下,我不确定是否要分解查询或使用两个查询… 我有点担心性能,因为我现在加入游戏下表:开发人员,发行者,元标

  • 问题内容: 有没有一种方法可以使Oracle查询的行为类似于包含MySQLlimit子句的行为? 在MySQL中,我可以这样做: 以获得第21到30行(跳过前20行,给出下10行)。这些行是在后面选择的,因此它实际上按字母顺序从第20个名称开始。 在Oracle中,人们唯一提到的是rownum伪列,但是它在之前 被评估,这意味着: 将返回一个随机的十行,按名称排序,这通常不是我想要的。它还不允许指

  • 我正在尝试从我的应用打开Gmail(点击按钮)。我只在Android11中面临这个问题。这不是打开Gmail。在本例中,QueryInputActivities返回空列表。 请帮助我解决android 11的这个问题。下面是我正在使用的代码。。

  • 问题内容: 我负责处理的应用程序之一是每隔x秒检查一次Oracle DB表,以查看是否有新数据要处理(其他实时应用程序正在填充该数据)。 我们新的客户业务流程迫使我们的实时性在同一时间(比如说10000)同时每天填充几次记录来填充该表。下次我的应用程序检查是否有任何要处理的内容时,遇到10 000条记录并尝试对其进行处理。 它的设计不是很好,而且扩展性还不够好。快速解决方案是限制该应用程序从Ora

  • 我正在努力学习GraphQL( 我只得到一级字段,比如: 以下是我的模式: 我的解析器: 知道我做错了什么吗?