如果Firestore用户集合在Android Kotlin中具有特定集合,如何在recyclerview中添加项目

时间:2019-09-30 09:20:18

标签: android kotlin google-cloud-firestore chat

正如您在firestore屏幕截图中看到的那样,我在用户集合中有两个用户,而在一个用户中,我已经参与了ChatChatChannels集合,因为聊天是针对一个用户开始的,而其他用户没有engageChatChannels

我想吸引所有参与了聊天频道的用户

我尝试了以下代码。我可以检查用户是否已订婚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 :(得分:0)

在实际检查是否存在之前,您正在解雇0。任何依赖于数据库数据的代码都必须在内部内,该数据可用时将触发该回调。

由于要执行多次检查,请考虑使用计数器检查所有检查是否都已完成:

let arr = [
  [1, 2],
  [10, 15],
  [30, 40],
  [-1, -50]
];


let newArr = []; 

for (let x = 0; x < arr.length; x++) {
  newArr.push(-Infinity); // populate it with `-Infinity`
  for (let y = 0; y < arr[x].length; y++) {
    if (newArr[x] < arr[x][y]) {
      newArr[x] = arr[x][y];
    }
  }
}

console.log(newArr) // 2,15,40,-1

请注意,我没有运行上面的代码,因此它可能包含语法错误。但是,我希望流程很清楚,onListen(items)调用位于回调内部,并且该计数器用于检查是否已完成所有子集合检查。


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