Как добавить элементы в программу RecyclelerView, если в коллекции пользователей Firestore есть определенная коллекция в Android Kotlin - PullRequest
0 голосов
/ 30 сентября 2019

Как вы можете видеть на скриншоте firestore, у меня есть два пользователя в коллекции пользователей, и у одного пользователя я включил коллекциюChatChannels, потому что чат запущен для одного пользователя, но у других нет включенногоChatChannels

Я хочу получитьвсем пользователям, которые включили чатChannels,

Я попробовал следующий код. Я могу проверить, есть ли у пользователя задействованная коллекцияChatChannel или нет, но я не могу добавлять элементы в mutableListOf в зависимости от условия. Я попытался удалить условие, но элементы не добавляются.

enter image description here

fun addUsersListener(context: Context, onListen: (List<Item>)->Unit): ListenerRegistration{
    return firestoreInstance.collection("users")
        .addSnapshotListener { querySnapshot, firebaseFirestoreException ->
            if(firebaseFirestoreException !=null){
                return@addSnapshotListener
            }


            val items = mutableListOf<Item>()
            querySnapshot?.documents?.forEach {


                firestoreInstance.collection("users")
                    .document(it.id).collection("engagedChatChannels").get()
                    .continueWith { result->

                        Log.v("CHATS", "Exits" + result.result?.size())
                        if(result.result!!.size() > 0)
                            items.add(
                                UserItem(
                                    it.toObject(User::class.java)!!,
                                    it.id,
                                    0,
                                    context
                                )
                            )
                    }

            }
            onListen(items)
        }
}

1 Ответ

0 голосов
/ 30 сентября 2019

Вы запускаете onListen(items) до того, как действительно проверите существование. Любой код, который зависит от данных из базы данных, должен быть внутри обратного вызова, который срабатывает, когда эти данные доступны.

Поскольку вы хотите выполнить несколько проверок, рассмотрите возможность использования счетчика, чтобы проверить, все лииз них завершено:

firestoreInstance.collection("users")
    .addSnapshotListener { querySnapshot, firebaseFirestoreException ->
        if(firebaseFirestoreException !=null){
            return@addSnapshotListener
        }

        val count = 0

        val items = mutableListOf<Item>()
        querySnapshot?.documents?.forEach {
            firestoreInstance.collection("users")
                .document(it.id).collection("engagedChatChannels").get()
                .continueWith { result->
                    if(result.result!!.size() > 0)
                        items.add(
                            UserItem(
                                it.toObject(User::class.java)!!,
                                it.id,
                                0,
                                context
                            )
                        )
                    }
                    count = count + 1
                    if (count == querySnapshot?.documents?.size) {
                        onListen(items)
                    }
                }
    }

Обратите внимание, что я не запускал приведенный выше код, поэтому он может содержать синтаксические ошибки. Тем не менее, я надеюсь, что поток ясен, поскольку и вызов onListen находится внутри обратного вызова, и счетчик, используемый для проверки того, были ли выполнены все проверки вложенных коллекций.


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

...