Дизайн запросов базы данных Firebase

У меня есть в основном список записей, которые многие пользователи могут читать (но не могут писать). Эти элементы отображаются в приложении на основе уникального целого числа, которое имеет каждая запись. Я хотел бы добавить способ разрешить каждому отдельному пользователю любить несколько x этих элементов, заставляя эти x элементы появляться первыми в списке. Есть ли способ, которым я могу достичь этого, используя запрос firebase без дублирования списка для каждого пользователя?

Вместо того, чтобы использовать FirebaseRecyclerAdapter и просто передавать запрос (это то, что я делал ранее), мне пришлось вручную управлять результатами и вместо этого использовать RecyclerView.Adapter . Это код, в котором я оказался. Я немного почищу его, чтобы на самом деле заменить элементы, если они уже есть, и обновить и еще много чего, но это краткое изложение необходимого подхода:

 val data = ArrayList<SomeData> val favorites = ArrayList<Favorite> val dataWithFavorites = ArrayList<SomeData> private val dbRef : DatabaseReference by lazy { FirebaseDatabase.getInstance().reference } private val dataQuery : Query by lazy { dbRef.child("data").orderByChild("rank") } private val favoritesQuery : Query by lazy { dbRef.child("users").child("$someUserId").child("favorites").orderByChild("name") } init { dataQuery.addValueEventListener(object : ValueEventListener { override fun onCancelled(p0: DatabaseError?) { } override fun onDataChange(p0: DataSnapshot?) { data.clear() p0!!.children.mapTo(dataList) { it.getValue(SomeData::class.java)!! } updateEntries() } }) favoritesQuery.addValueEventListener(object : ValueEventListener { override fun onCancelled(p0: DatabaseError?) { } override fun onDataChange(p0: DataSnapshot?) { favorites.clear() p0!!.children.mapTo(dataList) { it.getValue(Favorite::class.java)!! } updateEntries() } }) } private fun updateEntries() { if (data.isEmpty()) { return } val favoritesStrings = favorites.map { (id) -> id } val favoriteData = data .filter { favoritesStrings.contains(it.id) } .sortedBy { it.name } .onEach { it.isFavorite = true } dataWithFavorites.clear() dataWithFavorites.addAll(data) dataWithFavorites.removeAll(favoriteData) dataWithFavorites.forEach { it.isFavorite = false } dataWithFavorites.addAll(0, favoriteData) recyclerView.adapter?.notifyDataSetChanged() } 
Intereting Posts
Я получаю ошибку неоднозначности разрешения перегрузки при безопасном вызове kotlin Kotlin: параметры функции отправлены, но не выполнены? Сбор данных из разных снимков в FirebaseAdapter Лучше всего использовать lateinit? Ошибка: ошибка преобразования байт-кода в dex: Причина: com.android.dex.DexException: несколько файлов dex определяют Lorg / jetbrains / anko / collections / CollectionsKt; Почему проверка ссылочного равенства возвращает true, когда ссылка различна Android Studio 3.0 – Не удается найти метод «com.android.build.gradle.internal.variant.BaseVariantData.getOutputs () Ljava / util / List ' Как объявить параметр как функцию без возвращаемого значения? Как работают функции высшего порядка Котлина? Как динамически добавлять TextViews в мой макет на основе содержимого файла JSON? Неразрешенная ссылка: T Не удалось запустить приложение Kotlin в Eclipse Безглавая однопользовательская библиотека для JVM и JavaScript Android – Как достичь setOnClickListener в Котлине? Вызов countDownTimer