首页 > 解决方案 > Firebase 查询中带有 limitToLast() 的 endAt() 在 android 中无法按预期工作

问题描述

我正在使用 firebase 实时数据库来存储聊天消息架构如下所示

"chat_message" : {
    "up-29709425-fef2-490c-8335-77dbeafbce1e" : {
      "-MLhPH_i7bfvnTpccK1k" : {
        "chat_room_id" : "up-29709425-fef2-490c-8335-77dbeafbce1e",
        "created_at" : "2020-11-09T19:59:11+05:30",
        "creator_id" : 15456623,
        "message" : "hii",
        "message_type" : "text",
        "time_in_ms" : 1604932151865
      }
    },
    "up-299bcd2f-90bb-4ca2-b526-7e858d2d98fe" : {
      "-MLhWydTKmB52W_XFtS6" : {
        "chat_room_id" : "up-299bcd2f-90bb-4ca2-b526-7e858d2d98fe",
        "created_at" : "2020-11-09T20:32:47+05:30",
        "creator_id" : 15451746,
        "message" : "hoi",
        "message_type" : "text",
        "time_in_ms" : 1604934167159
      }
    }

问题是第一次,我得到 10 个项目,之后,我无法得到接下来的 10 个项目。这是我正在使用的查询

 private var query: Query? = null
private fun getInitialChatMessages(time: String?, key: String?) {
        query = if (time == null) {
            // For first time I am getting last 10 items 
              getFirebaseDbReference()
                .child(FIREBASE_DATABASE_LOCATION_MESSAGES)
                .child(project?.userProjectId!!)
                .orderByChild("time_in_ms")
                .limitToLast(INITIAL_FETCH_MESSAGE_COUNT)
        } else {
          // on scroll its not working   
            getFirebaseDbReference()
                .child(FIREBASE_DATABASE_LOCATION_MESSAGES)
                .child(project?.userProjectId!!)
                .orderByChild("time_in_ms")
                .endAt("$time")
                .limitToLast(INITIAL_FETCH_MESSAGE_COUNT)
        }

        query?.addListenerForSingleValueEvent(listener)
    }

任何帮助,将不胜感激。提前致谢。

标签: androidfirebasekotlinfirebase-realtime-database

解决方案


数据库中的time属性是一个数值,但在您的代码中,您将其作为字符串传递。当数据库比较一个数字和一个字符串时,它们永远不会相同。

因此,您需要修复您的代码,以便将时间视为一个数字,或者至少通过调用toDouble()它作为一个数字传递给数据库。


推荐阅读