首页 > 解决方案 > 如果firestore用户集合在Android Kotlin中有特定集合,如何在recyclerview中添加项目

问题描述

正如您在 firestore 屏幕截图中看到的那样,我在 users 集合中有两个用户,在一个用户中我有参与 ChatChannels 集合,因为聊天是为一个用户开始的,但其他用户没有参与 ChatChannels

我想接触所有参与聊天频道的用户,

我尝试了以下代码。我可以检查用户是否有参与的ChatChannel 集合,但我无法根据条件在 mutableListOf 中添加项目。我也尝试删除条件,但未添加项目。

在此处输入图像描述

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)
        }
}

标签: androidkotlingoogle-cloud-firestorechat

解决方案


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调用都在回调中,并且用于检查所有子集合检查是否已完成的计数器。


上述方法应该可行,但我通常会采用另一种方法。如果您需要在用户级别知道他们是否有某个子集合,我会将该事实存储在每个用户文档的字段中。这样,您可以简单地查询用户文档以获取具有正确值的文档,并防止这种嵌套循环/查询组合。


推荐阅读