Пейджинг запроса Android Firestore FirebaseFirestoreException: INVALID_ARGUMENTAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Пейджинг запроса Android Firestore FirebaseFirestoreException: INVALID_ARGUMENT

Сообщение Anonymous »

У меня есть функция, которая извлекает сообщения из моей базы данных Firestore, и я следую документации для разбиения запроса на страницы по последнему индексному документу, но по какой-то причине после первой выборки при попытке запустить следующий запрос я получаю com.google.firebase. firestore.FirebaseFirestoreException: INVALID_ARGUMENT: предложение Order by не может содержать повторяющиеся поля. uploadTimeStamp
Я также вошел в систему и увидел, что запрос выглядит нормально, а значение LastVisible на самом деле имеет индекс 4 в списке документов после выполнения первого запроса, но каким-то образом во втором запросе я снова получаю все первые 5 сообщений.
есть идеи, что я могу делать неправильно?

Код: Выделить всё

suspend fun getMyPosts(userID: String): Flow = flow {
Log.d(TAG, "getMyPosts() called -> userID is $userID")
var data: QuerySnapshot? = null
try {
data = dbRef.collection("posts")
.whereEqualTo("userID", userID)
.orderBy("uploadTimeStamp", Query.Direction.DESCENDING)
.limit(5)
.get()
.await()
Log.d(TAG, "emitting ${data.documents.size} posts: \n")
data.documents.forEach { doc ->
Log.d(
TAG,
"post number ${data.documents.indexOf(doc)}, timestamp: ${doc.get("uploadTimeStamp")}"
)
}

emit(data.documents)
while (!data!!.isEmpty && data.size() == 5) {
Log.d(TAG, "getting more posts")
val lastVisible = data.documents[data.size() - 1]
Log.d(TAG, "last index is ${data.size() - 1}")
Log.d(TAG, "lastVisible is ${lastVisible.get("uploadTimeStamp")}")
data = data.query
.whereEqualTo("userID", userID)
.orderBy("uploadTimeStamp", Query.Direction.DESCENDING)
.startAfter(lastVisible)
.limit(5)
.get()
.await()
if (!data.isEmpty) {
Log.d(TAG, "emitting ${data.documents}")
emit(data.documents)
}
}
} catch (e: Exception) {
Log.d(TAG, "Failed to get MyPosts,\n $e")
data!!.documents.forEach { doc ->
Log.d(
TAG,
"post number ${data.documents.indexOf(doc)}, timestamp: ${doc.get("uploadTimeStamp")}"
)
}
}
}

вот лог-код, когда я запускаю getMyPosts(), чтобы вы могли видеть, что я каким-то образом снова получаю первые 5 документов:

Код: Выделить всё

2021-06-03 12:31:33.349 4990-5249/avedot.app D/AppRepository: getMyPosts() called ->  userID is ncTe77npPHPJyQvJJdRUAY1fEBB3
2021-06-03 12:31:34.048 4990-5249/avedot.app D/AppRepository: emitting 5 posts:
2021-06-03 12:31:34.048 4990-5249/avedot.app D/AppRepository: post number 0, timestamp: 1622708658810
2021-06-03 12:31:34.048 4990-5249/avedot.app D/AppRepository: post number 1, timestamp: 1622708316148
2021-06-03 12:31:34.049 4990-5249/avedot.app D/AppRepository: post number 2, timestamp: 1622665878322
2021-06-03 12:31:34.049 4990-5249/avedot.app D/AppRepository: post number 3, timestamp: 1622665769466
2021-06-03 12:31:34.049 4990-5249/avedot.app D/AppRepository: post number 4, timestamp: 1622661053130
2021-06-03 12:31:34.082 4990-5249/avedot.app D/AppRepository: getImages() called
2021-06-03 12:31:34.083 4990-5249/avedot.app D/AppRepository: [false, false, true]
2021-06-03 12:31:35.345 4990-5249/avedot.app D/AppRepository: [false, true, true]
2021-06-03 12:31:36.068 4990-5249/avedot.app D/AppRepository: [true, true, true]
2021-06-03 12:31:37.084 4990-5249/avedot.app D/AppRepository: [false, false, true]
2021-06-03 12:31:37.294 4990-5249/avedot.app D/AppRepository: [false, false, true]
2021-06-03 12:31:37.500 4990-5249/avedot.app D/AppRepository: getting more posts
2021-06-03 12:31:37.500 4990-5249/avedot.app D/AppRepository: last index is 4
2021-06-03 12:31:37.501 4990-5249/avedot.app D/AppRepository: lastVisible is 1622661053130
2021-06-03 12:31:37.666 4990-5249/avedot.app D/AppRepository: Failed to get MyPosts,
com.google.firebase.firestore.FirebaseFirestoreException: INVALID_ARGUMENT: Order by clause cannot contain duplicate fields uploadTimeStamp
2021-06-03 12:31:37.666 4990-5249/avedot.app D/AppRepository: post number 0, timestamp: 1622708658810
2021-06-03 12:31:37.666 4990-5249/avedot.app D/AppRepository: post number 1, timestamp: 1622708316148
2021-06-03 12:31:37.667 4990-5249/avedot.app D/AppRepository: post number 2, timestamp: 1622665878322
2021-06-03 12:31:37.667 4990-5249/avedot.app D/AppRepository: post number 3, timestamp: 1622665769466
2021-06-03 12:31:37.667 4990-5249/avedot.app D/AppRepository: post number 4, timestamp: 1622661053130
это моя структура документа Firestore
Изображение


Подробнее здесь: https://stackoverflow.com/questions/678 ... d-argument
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»