【问题标题】:Get multiple child values from Firebase real time database using single callback使用单个回调从 Firebase 实时数据库中获取多个子值
【发布时间】:2021-10-21 18:57:10
【问题描述】:

我的 firebase 实时数据库中有这种类型的结构。我只想一次获取多个孩子的最后一项数据。

我遵循以下方法:

for (roomId in roomInformation.keys) { 

// roomInformation will contain some of room ids 
// to fetch from firebase db(not all roomIds from Messages)
    
    val messageObserver = object : ValueEventListener {
    ...
    }
    
    FirebaseDatabase.getInstance().reference
                .child("Messages")
                .child(roomId)
                .limitToLast(1)
                .addListenerForSingleValueEvent(messageObserver)
    
}

我不想从Messages 集合中获取所有childs (roomIds)。这种从 firebase 获取数据的循环方法正在工作,但我想在单个回调中获取所需的记录 (没有 for 循环)。有没有可能做到这一点,或者还有其他更好的方法吗?

更新: 更多说明:

根据图片:有一个 Messages 集合,其中包括房间的 id,在房间内有数千条消息。我想获取所有房间的最后一条消息。因此,根据我应用的查询: Messages -> RoomId -> limitToLast(1) 所以它会给我特定房间的最后一条消息信息。 用户可能会加入数百个房间,最初当用户登录时,我想显示所有房间的最后一条消息。所以我使用 for 循环 来获取房间的消息,所以 Firebase 会一次给我一个房间的最后一条消息,但我希望所有房间一次都有最后一条消息。 这里是所有房间,Messages Collection 有 300 个房间,如果 UserA 加入了 50 个房间,那么我只想要 Messages 的最后一条消息strong>50 间客房

【问题讨论】:

  • 您能否通过添加数据库截图以及不想使用循环的原因使其更清楚。此外,有关您正在使用的逻辑的更多信息可能会有所帮助。
  • 嘿尼克。为了更好地理解。您想获取 Messages 节点中存在的所有对象吗?意思是在节点深处有两层?
  • @AlexMamo - 更新了我的答案
  • @KARUNESHPALEKAR - 添加了更多说明。不使用 for 循环的理由 -> 尽量减少 Firebase 调用并减少获取数据的时间

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

Firebase 查询功能适用于节点的平面列表,因此它们无法一次性查询您在 /Messages 下的所有房间。但触发多个查询并不像许多开发人员想象的那么慢,如 Firebase pipelines the requests over a single web socket connection

如果您不想进行多次调用,解决方案是添加一个额外的数据结构,该结构正是您所需要的。例如,Firebase 上的聊天应用拥有顶级节点是很常见的:

"latestMessagePerRoom": {
  "theSameRoomIdYouAlreadyHave": {
    "timestamp": 1604488509642,
    "message": ...
    ...
  }
}

因此,每当您将消息push() 发送到聊天室时,您也会将其set 发送到此位置。您最终会得到一些重复的数据,但现在您为所有房间显示最新消息的用例变得易于实现。

在使用 NoSQL 数据库时,这是一个常见的权衡取舍,我的共同建议是让您的数据模型密切反映您在屏幕上显示的内容。所以在这里:如果您要显示每个聊天室的最新消息列表,这也是我们存储在数据库中的内容。

有关此类数据建模注意事项的更多指导,我建议查看 NoSQL data modeling 和 David East 的精彩视频系列 Firebase for SQL developers

【讨论】:

    猜你喜欢
    • 2021-04-03
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2020-06-19
    • 2021-11-04
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多