android - 如果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)
}
}
解决方案
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
调用都在回调中,并且用于检查所有子集合检查是否已完成的计数器。
上述方法应该可行,但我通常会采用另一种方法。如果您需要在用户级别知道他们是否有某个子集合,我会将该事实存储在每个用户文档的字段中。这样,您可以简单地查询用户文档以获取具有正确值的文档,并防止这种嵌套循环/查询组合。
推荐阅读
- c++ - Visual Studio 2010 C++ 项目链接失败:致命错误 LINK1171:无法加载 ole32.dll
- java - 如何修复我的 RSA 算法(java)中的资源泄漏?
- reactjs - 为什么参数 null 不能分配给打字稿中 setStateAction 类型的参数?
- flutter - 在 MaterialApp 中使用 `home` 属性和 `initialRoute`
- python - /login/user login() 处的 TypeError 采用 1 个位置参数,但给出了 2 个
- javascript - 无法导入外部 NPM 包来制作角度库
- python - conn.recv python套接字上的无限加载
- dataframe - 在点分隔符上拆分列
- macos - 在 Mac 上将 Xerces 库构建为通用二进制文件的问题
- angular - 使用共享服务在 Angular 中返回空的兄弟组件之间共享数据