Firebase 实时数据库:如何监听节点的特定项目子集?

Posted

技术标签:

【中文标题】Firebase 实时数据库:如何监听节点的特定项目子集?【英文标题】:Firebase realtime database: How to listen to a specific subset of items of a node? 【发布时间】:2021-04-16 04:12:15 【问题描述】:

我的 firebase 实时数据库中有以下结构:

艺术家 艺术家ID 姓名 绘画列表 绘画ID1 绘画ID2 画作(可以有 绘画ID1 副本 价格 绘画ID2 副本 价格 ... 绘画IDX 副本 价格

现在我想监听特定绘画 ID 和特定 ArtistID 的变化。 比如我想听 PaintingID1, PaintingID6, PaintingID7, PaintingID11。

到目前为止我的存储库代码:

override fun observeThisPainting(painting: Painting, receiveDataFromBackendCallback: DataFromBackendCallback<Painting>) 
        this.receiveDataFromBackendCallback = receiveDataFromBackendCallback
        val myRef = database.child("paintings").child(painting.paintingId)
        myRef.addValueEventListener(this)


override fun onDataChange(snapshot: DataSnapshot) 
    val painting = snapshot.getValue(Painting::class.java)
    painting?.let  receiveDataFromBackendCallback.onSuccess(it) 


override fun onCancelled(error: DatabaseError) 


    我的 RTDB 的架构是否正确?在我的第一次尝试中,我将所有画作保存在艺术家 listOfPaintings 中。现在我只在那里为他们保存密钥。 如何从我的视图模型中侦听特定节点的对象子集? (我知道如何监听绘画节点的所有项目,但我想知道是否有办法监听该节点的特定项目)

感谢您的想法!

【问题讨论】:

【参考方案1】:

您似乎在单个根节点下嵌套了多种不同类型的数据,structuring data 上的 Firebase 文档建议不要这样做。我通常期望三个***节点,在这样的 JSON 中:

Artists: 
  "ArtistId1":  name: "...", otherdata... ,
  "ArtistId2":  name: "...", otherdata... 
,
ArtistPaintings: 
  "ArtistId1":  
    "Painting1": true,
    "Painting3": true
  ,
  "ArtistId2":  
    "Painting2": true,
    "Painting4": true
  
,
Paintings: 
  "Painting1":  ... ,
  "Painting2":  ... ,
  "Painting3":  ... ,
  "Painting4":  ... ,

通过以上内容,您可以显示所有艺术家姓名的列表,而无需下载所有艺术家的所有绘画 ID。

然后,当用户选择艺术家时,您可以加载绘画 ID,然后加载该艺术家的绘画。如果有帮助,您可以存储比 true 更有意义的内容,例如绘画的标题或其元数据的子集,以便您无需进一步加载即可显示绘画列表。

如果您可能还需要查找艺术家的绘画,您通常会添加第四个***节点PaintingArtists

有关更多信息,请参阅我对 Many to Many relationship in Firebase 的回答。


关于您的第二个问题(以后请不要在一个帖子中提出多个问题):监听节点子集的唯一方法是通过查询。因此,例如,如果您想收听某个价格的所有画作,您需要对价格执行查询。

如果您想听某位艺术家的所有画作,您的选择是:

    在每幅画中包含艺术家 ID,并使用查询。这种数据重复在使用 NoSQL 数据库时非常常见,因为在应用中实现其他用例时,您通常会修改数据模型。 从/ArtistPaintings 获取艺术家的绘画ID,然后为每幅绘画使用单独的侦听器。这并不像 Firebase pipelines the requests over a single socket 那样缓慢/资源密集。

要了解有关 NoSQL 数据建模的更多信息,特别是 Firebase,请阅读 NoSQL data modeling、观看 Firebase for SQL developers 和可能的 Getting to know Cloud Firestore(后者适用于 Cloud Firestore,但许多机制也适用于实时数据库)。

【讨论】:

以上是关于Firebase 实时数据库:如何监听节点的特定项目子集?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?

如何从 Firebase 实时数据库中检索特定数据?

Firebase实时数据库如何在没有密钥的情况下获取子记录

用户扫描二维码以读取和写入特定数据库节点后如何在 Firebase 中设置安全规则

如何实现一个 Firebase 监听器来观察数据库的实时变化

从 Flutter 应用程序中的 Firebase 实时数据库事件获取父节点