Nano Hash - криптовалюты, майнинг, программирование

Как я могу объединить два запроса Firestore для передачи в качестве параметров на Kotlin

Я пытаюсь объединить 2 запроса, чтобы передать их в качестве параметров для отображения в моем FirestoreRecyclerView. Все методы, которые я нашел, будут объединять только задачи, и поэтому я могу передать задачу на setQuery. Ниже мой запрос1 и запрос2, и мне нужно объединить их в один запрос для отображения. Как я могу этого добиться?

        val query1 = firestoreRepo.getAllGames()
            .whereEqualTo(Constants.PLAYER1ID, currentUserID)
            .whereEqualTo("player2Id", argsId)
    
        val query2 = firestoreRepo.getAllGames().whereEqualTo("player2Id", currentUserID)
            .whereEqualTo("player1Id", argsId)


        val options: FirestoreRecyclerOptions<Games> = FirestoreRecyclerOptions.Builder<Games>()
            .setQuery(query, Games::class.java)
            .setLifecycleOwner(this)
            .build()

Класс данных игр

Игровой магазин


Ответы:


1

К сожалению, вы не можете передать два запроса в FirestorePagingOptions, разрешен только один. Если вам нужен результат двух запросов, вы должны использовать Tasks.whenAllSuccess(), как в следующих строках кода:

val query1 = firestoreRepo.getAllGames()
    .whereEqualTo(Constants.PLAYER1ID, currentUserID)
    .whereEqualTo("player2Id", argsId)

val query2 = firestoreRepo.getAllGames()
    .whereEqualTo("player2Id", currentUserID)
    .whereEqualTo("player1Id", argsId)

val firstTask = query1.get()
val secondTask = query2.get()

val combinedTask: Task<*> = Tasks.whenAllSuccess<Any>(firstTask, secondTask).addOnSuccessListener {
    //Do what you need to do with your list
}

При переопределении метода onSuccess() результатом является список объектов. Поскольку оба запроса возвращают объекты типа Games, вы можете просто привести объекты из списка к объектам типа Games. В этом случае вы больше не сможете использовать библиотеку Firebase-UI. Не идеально, но сойдет.

22.02.2021
  • Я попробовал этот метод, но у меня все еще возникают проблемы с отображением элементов в представлении ресайклера. Я добавил val gamesMutableList : List<Games> = it.filterIsInstance<Games>() gamesList.addAll(gamesMutableList) }, чтобы привести List‹Any› к моему классу Games и добавить его в gameList для отображения, но он не работает 22.02.2021
  • В этом случае добавьте снимок экрана вашей базы данных и содержимого вашего класса Games. 22.02.2021
  • Добавил оба скриншота. Когда я пробовал только с одним запросом, recyclerview отображался нормально. Я сменил FIrestoreAdapter на обычный адаптер и мне нужно отобразить список игр 22.02.2021
  • Вы уверены, что в базе данных есть хотя бы документ, удовлетворяющий обоим условиям? Боюсь, что нет. Кроме того, я думаю, что одного запроса будет достаточно, чтобы получить документ, подобный тому, что на скриншоте. 22.02.2021
  • Идея состоит в том, что и Player1, и Player2 могут ввести результат игры, и он будет отображаться для обоих. Если пользователь вводит результат, он будет сохранен как Player1Id, а оппонент — как Player2Id, но если его введет оппонент, все будет наоборот. Вот почему мне нужно получить их обоих 22.02.2021
  • Вы на 100% уверены, что у вас есть в базе хотя бы документ, удовлетворяющий обоим условиям? 22.02.2021
  • 100%. Я ввел результат игры с Player1 и результат игры с Player2, каждая игра записывается с идентификатором пользователя, который ввел ее как PlayerID1. 22.02.2021
  • Вы уверены, что передаете точные идентификаторы в обоих запросах? 22.02.2021
  • Я уверен. Запрос, который мне нужен, должен быть на SQL, например SELECT * FROM games WHERE (playerId1 = currentUserId AND playerId2 = argsId) OR (playerId2 = currentUserId AND playerId2 = argsId), а затем автоматически загружаться в моем recyclerVIew. Я могу сделать это только с одной частью запроса. С помощью метода, который я нашел на вашем веб-сайте, я смог добиться этого по-другому, но также только с одним запросом, я не могу объединить два из них, чтобы отобразить все как объект игры. 22.02.2021
  • Пока у вас есть документы базы данных, которые удовлетворяют вашему запросу, и идентификаторы верны, этот список должен содержать эти объекты. 22.02.2021
  • Но как преобразовать результат комбинированной задачи в объект Games? Лямбда-выражение дает мне List‹Any›, и мне нужно преобразовать его в List‹Games›. С одним Таском использовал этот val firstTask = query1.get().addOnCompleteListener { task -> if (task.isSuccessful) { val document: QuerySnapshot? = task.result val games: List<Games> = document?.toObjects(Games::class.java) as List<Games> gamesList.addAll(games) } } но на комбинированном не работает 22.02.2021
  • Нет, не так. Вы должны перебрать список объектов и привести каждый объект к объекту типа Games, хорошо? 22.02.2021
  • Привет. Вы решили проблему? 23.02.2021
  • Да, я наконец сделал это. Попробовав кучу обходных путей, я создал дополнительное поле player = player1 + _ + player2, а затем запросил его с предложением whereIn. 23.02.2021
  • Рад это слышать ;) 23.02.2021
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..