EnDat() с limitToLast() в запросе Firebase работает не так, как ожидалось в Android

#android #firebase #kotlin #firebase-realtime-database

# #Android #огневая база #kotlin #firebase-база данных в реальном времени

Вопрос:

Я использую базу данных 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)
    }
 

Любая помощь будет признательна. Заранее благодарю.

Ответ №1:

time Свойство в вашей базе данных представляет собой числовое значение, но в вашем коде вы передаете его как строку. Когда база данных сравнивает число и строку, они никогда не совпадают.

Таким образом, вы захотите исправить свой код таким образом, чтобы он также обрабатывал время как число или, по крайней мере, передавал его как число в базу данных, вызывая toDouble() его.

Комментарии:

1. Спасибо за ответ. Но EnDat() принимает только строковое или логическое или двойное значение.

2. ОК. В этом случае вы можете передать его как Double .

3. Я хотел знать одну вещь, как получить следующий набор элементов, используя EnDat() и limitToLast(). Я также получаю последние элементы в следующем наборе элементов.

4. Это ожидаемо: при работе запросов к базе данных Firebase в реальном времени вы всегда будете получать один перекрывающийся элемент, который вам придется игнорировать на стороне клиента в одном из двух результатов.