#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 в реальном времени вы всегда будете получать один перекрывающийся элемент, который вам придется игнорировать на стороне клиента в одном из двух результатов.